【Java】「深入理解Java虚拟机」学习笔记(5)- 类加载
C/C++在编译时需要进行连接,而Java的类加载、连接和初始化是在运行时完成的。

图 类的生命周期
图中解析的过程不一定在准备和初始化之间,也可以在初始化之后再开始,以支持Java的运行时动态绑定。
一、类加载过程
1、加载
加载是整个“类加载”过程的第一个阶段。这一步也叫“加载”,可以理解为把类从文件中读取到内存中并按一定数据结构保存以备后续使用。
主要分为三个步骤:
①通过类的全限定名获取其字节码。
②将字节码中的静态存储结构转换成方法区的运行时数据结构。
③在内存中创建一个代表这个类的java.lang.Class对象,作为该类的元数据访问入口。那么你现在知道了反射的时候,someClass.class这个对象是怎么来的了吧?只要拿到这个class你想创建实例、调用方法都行,想干哈就干哈。
数组的加载有所不同,因为数组本身是VM自己创建的,但数组中的元素类型可能是类,还是要靠类加载器去加载。所以数组的加载分两种情况:
①当数组的类型是引用类型,那就递归按照上面的方法加载。
②当数组的类型是基本数据类型如int [],则VM将会将该数组标记为与Bootstrap加载器关联。
2、验证
验证的目的是确保当前字节码文件中的内容,符合当前VM的要求,不会给VM运行造成危害。
验证过程包括:文件格式验证、元数据验证、字节码验证和符号引用验证。
这一步作用类似于语法检查。因为字节码的编译是在JVM之外进行的(可能来自本地jar包甚至网络),不同版本的编译器生成不同版本规范的字节码,可能带来兼容性问题。另外,也能防范恶意的字节码修改影响虚拟机的运行稳定。
3、准备
这个过程主要是为类变量分配内存(分配在方法区中)并赋默认初值(如int的初值为0,char为'\u0000')。
4、解析
解析是将常量池内的符号引用替换为直接引用的过程。
5、初始化
初始化就是执行构造方法的过程。
|
♣所以你应该知道了成员变量初始化时刻有两次 一次是在类加载的准备过程中、然后就是在调用构造方法的时候。 |
二、类加载器
类加载器有各自的类名称空间,两个类加载器即使加载了同一个.class文件,生成的类被认为是不同的类。这也可以理解,它们在方法区本来保存的就是两份。
1、类加载器分类

2、双亲委派模型
双亲委派的流程就是甩锅的过程。Bootstrap是顶层Loader,UserDef是底层Loader。底层Loader在接到类加载指令时啥也不干,把锅直接甩给上一层Loader,依次类推
直到锅甩到Bootstrap(也就是说所有的锅都会到它这儿)。如果Bootstrap的路径里有这个类,算它倒霉它加载,否则它再把锅弹回给下一层Loader—Extension,如果
Extension的类路径里有这个类,它加载。依次类推。。。
双亲委派模型的好处是:它的这种上层优先的层级关系保证了,类加载的有序性,不会因为各路Loader自行加载导致的混乱。
PS:Tomcat的类加载机制
https://blog.csdn.net/varyall/article/details/81610620
【Java】「深入理解Java虚拟机」学习笔记(5)- 类加载的更多相关文章
- 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势
0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...
- 《深入理解Java虚拟机》学习笔记之类加载
之前在学习ASM时做了一篇笔记<Java字节码操纵框架ASM小试>,笔记里对类文件结构做了简介,这里我们来回顾一下. Class类文件结构 在Java发展之初设计者们发布规范文档时就刻意把 ...
- (转)《深入理解java虚拟机》学习笔记6——类加载机制
Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需要完成以下 ...
- 【Java】「深入理解Java虚拟机」学习笔记(4)- 类文件结构
我为什么喜欢Java,另一个重要原因就是跨平台,WORA. 程序员是爽了,但肯定有人要为你遮风挡雨,解决WORA的基石就是字节码+虚拟机. ♣Tip 其实这里存在两种无关性,一是平台无关性.另一个是语 ...
- 【Java】「深入理解Java虚拟机」学习笔记(2)- JVM内存区域
一.运行时数据区 JVM在执行Java程序的时候,将其运行时数据区划分为若干不同区域.它们的用途和创建及销毁的时间不同. 1.程序计数器(Program Counter Register) 是一块很小 ...
- 「中国剩余定理CRT」学习笔记
设正整数$m_1, m_2, ... , m_r$两两互素,对于同余方程组 $x ≡ a_1 \ (mod \ m_1)$ $x ≡ a_2 \ (mod \ m_2)$ $...$ $x ≡ a_r ...
- Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...
- Java虚拟机内存溢出异常--《深入理解Java虚拟机》学习笔记及个人理解(三)
Java虚拟机内存溢出异常--<深入理解Java虚拟机>学习笔记及个人理解(三) 书上P39 1. 堆内存溢出 不断地创建对象, 而且保证创建的这些对象不会被回收即可(让GC Root可达 ...
- 《深入理解Java虚拟机》学习笔记
<深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...
随机推荐
- OO第一次单元总结
第一次总结性博客 16071070 陈泽寅 2019.3.23 一.第一单元所学总结 首先先来总结一下第一单元我所学到的知识以及所感所悟.第一个单元,是我第一次接触JAVA语言,并且再使用了几次之后, ...
- MySQL数据库8.0.15 安装教程
第一步:安装MySQL服务 这里下载完成的是一个压缩文件,直接将里面的‘mysql-8.0.15-winx64'文件夹解压到你想要安装的路径即可,我是直接安装在C盘的. 解压完后的文件路径如下图: 在 ...
- Python基础:语法基础(3)
本篇主要介绍Python中一些基础语法,其中包括:标识符.关键字.常量.变量.表达式.语句.注释.模块和包等内容. 1. 标识符和关键字 1.1 标识符 标识符是变量.常量.函数.属性.类.模块和包等 ...
- Linux学习之路2-linux系统烧写
fastboot烧写方式 准备工作: 硬件– 串口线连接开发板串口con3到PC的串口– OTG线连接开发板的OTG接口和PC的USB接口软件– 串口工具(超级终端),默认波特率为115200– 烧写 ...
- mysql join用法简介
为什么需要join 为什么需要join?join中文意思为连接,连接意味着关联即将一个表和多个表之间关联起来.在处理数据库表的时候,我们经常会发现,需要从多个表中获取信息,将多个表的多个字段数据组装起 ...
- Word技巧设置
1.如何在Word中快速输入上下标 下标~~同时按住:Ctrl 和 =键: 上标~~同时按住:Ctrl 和 Shift 和 +键: 2.如何删除Word中产生的空白页 设置 段落 中的 固定值 ...
- RSA加解密工具类RSAUtils.java,实现公钥加密私钥解密和私钥解密公钥解密
package com.geostar.gfstack.cas.util; import org.apache.commons.codec.binary.Base64; import javax.cr ...
- 【简】题解 AWSL090429 【噪音】
因为每次加上一头奶牛 是什么不重要 牛棚之间贡献除清空操作外无影响 就只要考虑 每个牛棚清空分x次 的贡献 x之和为k 求贡献和最小 一个牛棚清空x次 显然平均清空贡献最小 再用等差数列的 ...
- 【php】php7新特性及其优化原理
php7.x版本系列相比之前的php的版本提交性能提高了不少,这里面其中的一些主要改变是性能提高的关键,主要有以下内容. 1.zval使用栈内存 在zend引擎和扩展中,经常要创建php变量,其底 ...
- shiro多Realm第一次调用不生效问题
1. 由于最近自己写的一个项目上用到了多realm的使用,遇到了一个这样的问题: 1. 自己继承了BasicHttpAuthenticationFilter,实现了获取token,然后直接请求api的 ...