-
一个类从被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期包括__7个__阶段
(1) 加载
(2) 验证
(3) 准备
(4) 解析
(5) 初始化
(6) 使用
(7) 卸载
其中,连接包括了 2,3,4 三个步骤, 所以也可以写作 加载 --> 连接 --> 初始化 – > 使用 --> 卸载
-
1,2,3,5,7 一定是按部就班的进行,解析阶段有可能是初始化阶段后才开始(动态绑定)
-
何时进行第一个步骤__加载__没有强制规定,交给虚拟机自由实现
-
虚拟机规范规定了有且只有5种情况必须立即对类进行初始化(第5步),当然这之前要进行连接过程
(1)
1° new实例化对象时 2° 调用一个类的静态方法时 3° 读取或设置类的静态变量时(__被final修饰的静态变量除外__,因为编译器final static变量已经放入常量池了)(2) 使用 java.lang.reflect包中的方法对类进行__反射调用__时,如果类没有进行过初始化,则先触发类的初始哈
(3) 初始化一个类时,如果父类没有初始化,则先初始化父类
(4) 虚拟机启动时,用户需要指定一个包含main方法的主类,虚拟机会先初始化这个类
(5) 使用1.7的动态语言支持,java.lang.invoke.MethodHandle ?
-
类的初始化过程中,接口和类的唯一区别
第3种,一个接口初始化时,不需要要求它的父接口必须初始化完毕
-
以上5种情况称为对类的__主动引用__,除此以外引用类的方式都称为__被动引用__。只有主动引用(以上5种)才能触发类的初始化
-
常见的被动引用的例子
(1) 通过子类引用父类的静态变量,只会触发父类的初始化,不会触发子类的初始化
(2) 创建对象的数组,不会触发此类的初始化
(3) 使用常量static final不会触发类的初始化,因为在编译过程中,常量已经存储到了常量池中,和原有类的class文件没有任何联系
chapter07_虚拟机类加载机制_3_类加载的过程
最新推荐文章于 2025-08-05 23:03:41 发布
本文详细阐述了Java类从加载到卸载的七个生命周期阶段,包括加载、验证、准备、解析、初始化、使用和卸载。重点讲解了初始化阶段的触发条件,以及主动引用和被动引用的区别。
661

被折叠的 条评论
为什么被折叠?



