专栏首页云霄雨霁Java虚拟机--类加载的时机

Java虚拟机--类加载的时机

类加载时机:

类从被加载到内存中开始,到卸载出内存为止,要经历7个阶段:

加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类加载过程中必须按照这种顺序按部就班的开始(注意是“开始”,而不是“完成”,因为这些阶段通常是交叉进行的),而解析阶段不确定,解析阶段可以在初始化之前或之后进行,这也正是Java支持动态绑定的原因。

什么情况下需要开始类加载的第一个阶段----加载,Java虚拟机没有强制约束,但Java虚拟机强制约束了类的初始化的开始时间(而加载、验证、准备自然在初始化之前进行),有且只有以下5种情况对类进行初始化:

  1. 遇到new、getstatic、putstatic、invokestatic四个字节码命令时。这四条指令最常见的Java代码是:使用new关键字实例化对象、读取或设置一个类的静态字段、调用一个类的静态方法。
  2. 使用java.lang.reflect包的方法对类进行反射调用时。
  3. 当初始化一个类时,如果其父类还没有初始化,则需要先初始化父类。
  4. 虚拟机启动时,虚拟机会先初始化主类(含有main()的哪个类)。
  5. 当使用动态语言支持时(JDK1.7以上),如果一个Java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄对应的类没有初始化,需要先初始化。

这5种场景中的行为称为对一个类的主动引用。除此以外,所有引用类的方式都不会出发初始化,称为被动引用。下面是三种被动引用的例子:

1、对于静态字段,只有直接定义这个字段的类才会被初始化。因此通过子类引用父类中定义的静态字段,只会触发父类初始化。

可以看出,并没有输出“SubClass",说明SubClass没有被初始化。

2、创建一个类的数组,不会触发该类的初始化。

可以看出,没有任何输出,说明SuperClass没有被初始化。

3、引用一个类的常量,不会触发该类的初始化。

可以看出,没有输出”ConstClass“,说明ConstClass没有被初始化。

接口的初始化:

接口的加载过程与类的加载过程稍微有一点不同:接口也有初始化过程,这点和类一样。接口和类的区别在与5种场景的第三种:当一个类初始化时,要求其父类都初始化了,但一个接口初始化时,并不要求父接口初始化,只有在真正使用到父接口时才进行初始化。

下一篇:Java虚拟机--类加载过程

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JVM--类加载

    Java虚拟机没有强制约束什么情况下需要开始类加载的第一个阶段--加载,但Java虚拟机强制约束了类的初始化的开始时间(而加载、验证、准备自然在初始化之前进行)...

    SuperHeroes
  • Java 对象初始化顺序

    SuperHeroes
  • 追踪分析解决办法

    SuperHeroes
  • java与C++变量初始化的对比

    Tencent JCoder
  • 吴恩达团队:神经网络如何正确初始化?

    初始化对训练深度神经网络的收敛性有重要影响。简单的初始化方案可以加速训练,但是它们需要小心避免常见的陷阱。

    AI科技大本营
  • 虚拟机的类加载机制1 类加载的时机

    JavaEdge
  • Java编程思想学习录(连载之:初始化与清理)

    CodeSheep
  • 吴恩达深度学习课最新补充教程:交互式demo助你轻松理解神经网络初始化

    这篇教程共包括四部分:有效初始化的重要性、梯度爆炸或消失问题、什么是恰当的初始化,以及 Xavier 初始化的数学证明。

    用户2769421
  • 吴恩达深度学习课最新补充教程:交互式demo助你轻松理解神经网络初始化

    这篇教程共包括四部分:有效初始化的重要性、梯度爆炸或消失问题、什么是恰当的初始化,以及 Xavier 初始化的数学证明。

    机器之心
  • 神经网络到底该如何初始化?吴恩达Deeplearning.ai最新干货

    初始化会对深度神经网络模型的训练时间和收敛性产生重大影响。简单的初始化方法可以加速训练,但使用这些方法需要注意小心常见的陷阱。本文将解释如何有效地对神经网络参数...

    abs_zero

扫码关注云+社区

领取腾讯云代金券