1. 类加载机制
1.1 过程概要 ⭐
- 加载:将class文件中的类信息通过二进制流的形式加载到JVM内存中
- 连接包括三个步骤
验证:
主要是判断是否符合Class文件规范,保证JVM安全性
。准备:
为类静态变量分配内存并初始化零值。解析:
将常量池中的符号引用替换为直接引用。
- 初始化
- 最后两个步骤
使用
和卸载
(不太关注)
1.2 过程分析
① 加载
- 通过全类名来加载
定义该类
的二进制字节流。 - 将字节流所代表的静态存储结构转换为
方法区的运行时数据结构
。 - 在堆内存中生成代表该类的
Class对象
,作为方法区这个类各种数据的访问入口
。
注意:之所以使用定义该类
这个词而不直接使用Class文件是因为类的定义不一定是以Class文件的形态来表示的,还有jar,加密文件,网络传输,数据库存储,运行时生成(动态代理),等各种形态来定义对象,但他们的本质都是一串二进制字节流。
② 连接
步骤一:验证
简单来说就是验证是否符合Class文件规范,保证JVM
安全性
。
文件格式验证
,验证字节流是否符合Class文件格式规范。元数据验证
字节码验证
符号引用验证
步骤二:准备
为
类静态变量
分配内存并初始化零值。注意:这一阶段初始化的变量只包括类变量(static修饰的变量),不包括实例变量,实例变量在对象的实例化过程中一起分配到堆中,其次static变量在准备阶段只是初始化零值,赋值动作发生在类的初始化阶段。
步骤三:解析
将常量池中的符号引用替换为直接引用,简单来说就是直接将引用定位到常量池中的内存地址。
③ 初始化
初始化是类加载过程中的最后一个步骤,主要是执行类构造器中的方法,该方法不是程序员定义的方法,
是编译器自动收集类中的static变量赋值和静态语句块中的语句合并而成的
。
2. Java虚拟机对象的创建过程
2.1 对象的创建过程
2.2 对象的内存布局
对象在内存中分为三部分
- 对象头(Header)
- 运行时自身数据(Mark Word)…
- 类型指针,指向实例的类型Class
- 数组大小,数组类型才有
- 实例数据(Instance Data)
- 对对象定义的数据,字段(包括继承自父类的)
- 对其填充(Padding)
- 实例的大小必须是8^n,不满就需要对其填充
对对象头中运行时自身数据的详细描述:
- hash值
- 锁状态,锁标志位
- 分代年龄
参考资料
书籍《深入理解Java虚拟机》周志明
博客 掘金好文