类加载过程
![](https://img.haomeiwen.com/i27505915/b13fa307c2e0ff9d.png)
当虚拟机遇⻅new关键字时候,实现判断当前类是否已经加载,如果类没有加载,⾸先执⾏类的加载机制,加载完成后再为对象分配空间、初始化等。
1. ⾸先校验当前类是否被加载,如果没有加载,执⾏类加载机制
2. 加载:就是从字节码加载成⼆进制流的过程
3. 验证:当然加载完成之后,当然需要校验Class⽂件是否符合虚拟机规范,跟我们接⼝请求⼀样,第⼀件事情当然是先做个参数校验了
4. 准备:为静态变量、常量赋默认值
5. 解析:把常量池中符号引⽤(以符号描述引⽤的⽬标)替换为直接引⽤(指向⽬标的指针或者句柄等)的过程
6. 初始化:执⾏static代码块(cinit)进⾏初始化,如果存在⽗类,先对⽗类进⾏初始化
Ps:静态代码块是绝对线程安全的,只能隐式被java虚拟机在类加载过程中初始化调⽤!(此处该有问题static代码块线程安全吗?)当类加载完成之后,紧接着就是对象分配内存空间和初始化的过程
1. ⾸先为对象分配合适⼤⼩的内存空间
2. 接着为实例变量赋默认值
3. 设置对象的头信息,对象hash码、GC分代年龄、元数据信息等
4. 执⾏构造函数(init)初始化
网友评论