jvm技术文程序员

《深入理解jvm》读书笔记之——类加载机制(类的初始化)

2016-11-14  本文已影响236人  jsondream

类加载的生命周期:

加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载

加载 -> 验证 -> 准备 -> 初始化 -> 卸载 这5个阶段顺序是确定的,klass的加载过程一定会按照这个顺序执行。为了支持java的运行时绑定,解析阶段在某些情况下会在初始化之后才进行。

类的初始化阶段

对于加载这个阶段是跟具体的虚拟机实现有关,对于整个类加载阶段最重要的就是初始化这个阶段.

JVM执行初始化的情况

对于Hotspot虚拟机而言,遇见以下这5种情况就需要进行初始化:

这里我们需要注意的点,上面的五种情况指的是主动的引用方式,除了上面5种主动引用之外的被动引用是不会触发初始化的.

类的被动引用实例:

情况一:通过子类来引用父类的静态字段,是只会执行父类的初始化而子类不会初始化的,但是Hotspot虚拟机下会触发子类的加载和验证。

情况二:声明一个数组类型的类。因为jvm会调用newarray生成一个继承自object的子类,这个类代表了对应的这个类型的数组类型。

情况三:A引用了B中fianl修饰过的静态属性不会导致B的初始化,因为经过编译器的优化,A中引用的这个B的属性元素已经在编译时期存储到了A类下的常量池中,所以其实A下的引用来自于对自身常量池的引用。

我们这里还需要注意的一点是接口和类不同的就是接口的父接口只有在真正被使用的时候才会被初始化。

类的初始化之clinit方法

对于jvm而言,类的初始化也就是执行clinit方法,那么什么是clinit方法?

clinit方法是有编译器自动收集类中的所有变量的赋值动作和静态语句块中的语句合并产生的一个用于jvm执行类的初始化的方法。

需要注意以下几点:

验证猜想的小技巧

关于我们文章上述初始化过程中,如何验证,我们可以吧代码在写在类的static块里,就能验证我买的猜想了。原理就在上文关于clinit方法中。

上一篇 下一篇

猜你喜欢

热点阅读