JVM-类加载时机

11 篇文章 0 订阅

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、接口的加载

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

总结

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。

由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!

全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值