JVM基础之类加载

首先来说一下类的整个生命周期,它包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段,其中验证、准备、解析这3个部分统称为链接。
虚拟机规范严格规定了有且只有5种情况必须对类进行初始化:
1. 使用new关键字实例化对象的时候(对应new 字节码指令)、读取或者设置(对应getstatic , putstatic字节码指令)一个类的静态字段(被final修饰、已经在编译器把结果放入常量池的静态字段除外)的时候、以及调用一个类的静态方法的时候;
2. 使用java.lang.reflect包的方法对类进行反射调用的时候;
3. 当初始化一个类时,如果其父类还没有进行过初始化,则需要先触发其父类的初始化;
4. 虚拟机启动时,包含main()方法的主类,虚拟机会先初始化这个主类;
5. 当使用JDK1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic, REF_PutStatic, REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化时,需要先触发其进行初始化;
类加载过程的7个阶段中每个阶段所做的工作:
1. 加载阶段:在加载阶段主要完成以下3件事情:
1)通过一个类的全限定名class类文件来获取定义此类的二进制流,没有明确限定二进制字节流的来源;
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;
3)在内存中生成一个代表这个类的Java.lang.Class对象(与一般对象存储在Java堆中不同,Class存储在方法区中),作为方法去这个类的各种数据的访问入口;
2. 验证阶段:文件格式验证、元数据验证、字节码验证、符号引用验证。
3. 准备阶段:正式为类变量在方法区中分配内存,并设置类变量的初始值阶段,这里的初始值是指“数据类型的零值”,而不是你所写的程序代码对类变量进行初始化赋值的值;注意,如果类变量被final修饰,那么类变量则直接会被你的程序代码所赋予的初始值;
public static final int value=123;
如上代码中,value在准备阶段会被直接赋值为123,而不是0;
4. 解析阶段:将常量池内的符号引用替换为直接引用的过程;
5. 初始化阶段:执行程序的字节码对类进行初始化;

参考 周志明书《深入理解JVM虚拟机》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值