栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JVM-类加载时机

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM-类加载时机

1、类的生命周期

类的生命周期有这七个阶段,加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载,具体如下图所示:

 

其中加载、验证、准备、初始化和卸载顺序是确定的,类加载必须按照这个顺序开始,但解析阶段可能存在在初始化之后才开始,如Java语言的运行时绑定。 需要注意的是,这几个阶段有可能是交替进行的,并不是一一按顺序来执行,等待一个阶段结束,另外一个阶段才开始。 2、什么时候开始 当真正使用主动引用到类的时候,才会触发类加载

 2.1、主动引用

遇到 new、getstatic、putstatic、invokestatic 字节码指令,例如:

使用 new 实例化对象;读取或设置一个类的 static 字段(被 final 修饰的除外);调用类的静态方法。对类进行反射调用;初始化一个类时,其父类还没初始化(需先初始化父类);

这点类与接口具有不同的表现,接口初始化时,不要求其父接口完成初始化,只有真正使用父接口时才初始化,如引用父接口中定义的常量。虚拟机启动,先初始化包含 main() 函数的主类;JDK 1.7 动态语言支持:一个 java.lang.invoke.MethodHandle 的解析结果为 REF_getStatic、REF_putStatic、REF_invokeStatic。

2.2、被动引用

通过子类引用父类静态字段,不会导致子类初始化;Array[] arr = new Array[10]; 不会触发 Array 类初始化;static final VAR 在编译阶段会存入调用类的常量池,通过 ClassName.VAR 引用不会触发 ClassName 初始化。

2.3、接口的加载

与类加载过程有点不一样,它的初始化需要在父接口全部完成初始化,同时真正使用到了父接口的时候才会进行初始化(初始化自然包含前边的几个阶段了)

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/764208.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号