Java虚拟机把描写叙述类的数据从Class文件载入到内存。并对数据进行校验、转换解析和初始化。终于形成能够被虚拟机直接使用的Java类型。这就是虚拟机的载入机制。

类从被载入到虚拟机内存中開始,到卸载出内存为止。它的整个生命周期包含了:载入(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(using)、和卸载(Unloading)七个阶段。

当中验证、准备和解析三个部分统称为连接(Linking),例如以下如所看到的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

这七个阶段,载入、验证、准备、初始化和卸载这五个阶段的顺序是确定的。类的载入过程必须依照这个顺序来按部就班地開始,而解析阶段则不一定,它在某些情况下能够在初始化阶段后再開始。

类的生命周期的每个阶段通常都是互相交叉混合式进行的。一般会在一个阶段运行的过程中调用或激活另外一个阶段。

Java虚拟机规范没有强制性约束在什么时候開始类载入过程。可是对于初始化阶段,虚拟机规范则严格规定了有且仅仅有四种情况必需马上对类进行“初始化”(而载入、验证、准备阶段则必需在此之前開始)。这四种情况归类例如以下:

1.遇到new、getstatic、putstatic或invokestatic这4条字节码指令时。假设类没有进行过初始化,则须要先触发其初始化。生成这4条指令最常见的Java代码场景是:使用newkeyword实例化对象时、读取或者设置一个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)时、以及调用一个类的静态方法的时候。

2.使用java.lang.reflect包的方法对类进行反射调用的时候。假设类没有进行过初始化,则须要先触发其初始化。

3.当初始化一个类的时候,假设发现其父类还没有进行过初始化,则须要触发父类的初始化。

4.当虚拟机启动时,用户须要指定一个运行的主类(包括main()方法的类),虚拟机会先初始化这个类。

对于这四种触发类进行初始化的场景,在java虚拟机规范中限定了“有且仅仅有”这四种场景会触发。这四种场景的行为称为对类的主动引用,除此以外的全部引用类的方式都不会触发类的初始化,称为被动引用。

以下通过三个实例来说明被动引用:

演示样例1:

父类SuperClass.java
public class SuperClass {
static{
System.out.println("SuperClass init!");
}
public static int value = 123;
}
子类SubClass.java
public class SubClass extends SuperClass {
static{
System.out.println("SubClass init!");
}
} 主类NotInitialization.java
public class NotInitialization {
public static void main(String[] args) {
System.out.println(SubClass.value);
}
}
输出结果:

SuperClass init! 

123  

由结果能够看出仅仅输出了“SuperClass init!

”,没有输出“SubClass init。”。这是由于对于静态字段,仅仅有直接定义该字段的类才会被初始化。因此当我们通过子类来引用父类中定义的静态字段时,仅仅会触发父类的初始化,而不会触发子类的初始化。

演示样例2:

SuperClass[ ]   scs=new SuperClass[11];

如上。当初始化一个对象数组的时候。也不会触发类的初始化。

演示样例3:

public class ConstClass {

   static {

    system.out.printl("const");

}

   public static final int age =123;  

}

public class NotInitialization{

     public static void main(String[ ] args){

     system.out.println(ConstClass.age);

}

此时并不会出现 “const”,由于在NotInitialization类在编译的时候已经把ConstClass中的变量age放在常量池中了,訪问时直接取出age就可以。不会引发ConstClass的初始化。

JVM中java类的载入时机的更多相关文章

  1. JVM中java类的加载时机(转载:http://blog.csdn.net/chenleixing/article/details/47099725)

    Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制.类从被加载到虚拟机内存中开始,到卸载出内 ...

  2. JVM:Java 类的加载机制

    虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验,转换,解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制. 类的生命周期 类从被加载到虚拟机内 ...

  3. hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化

    hibernate映射文件??.hbm.xml配置映射元素详解--Hibernate映射类型 在从Hibernate的java的成员类型映射到SQL中的数据类型,其内映射方式它满足,SQL可以自己调制 ...

  4. MyEclipse2014中Java类右键Run as没有JUnit Test

    Java初学,想试试连接本地数据库,按照百度经验中的方法,在最后执行测试的卡住了,为啥?因为MyEclipse中右键Run as没有JUnit Test选项! 6.1.测试数据库mysql是在项目中连 ...

  5. Maven项目中java类报错-Cannot resolve symbol

    电脑蓝屏了,强制重启之后再打开IDEA里面的项目,所有Java类文件都在报Cannot resolve symbo错误,可以确定所有依赖的包都有引用且jar包没有冲突. 经查询找到这个解决方法: 在I ...

  6. JVM中java实例对象在内存中的布局

    普通的Java对象实例 和  Java数组实例.Java数组实例的对象头多了一个数组的长度.Java虚拟机可以通过普通java对象的元数据来确定java对象的大小,但是从数组的元数据中却无法确定数组的 ...

  7. JVM中存储类信息的三个表格

    摘自:<Java Performance>第三章 Internal Class Loading Data The HotSpot VM maintains three hash table ...

  8. IntelliJ IDEA中Java类注释

    打开Idea,依次选择File-->Settings-->Editor-->File and CodeTemplates ,右侧tab选项卡点击Includes,选择File Hea ...

  9. Android Studio使用过程中Java类突然报红,但项目可运行解决方案

    1.点击File->Invalidate Caches / Restart... 2.重启Gradle,清除缓存 3.Clean Project

随机推荐

  1. go之map

    一.概念 简述 1.map 是一种无序的键值对的集合.(类似于python的字典dict) 2.map 的key 与 value 都是有类型的,且定义阶段时就已经统一 定义方式 # 方式一 var m ...

  2. buf.readInt32LE函数详解

    offset {Number} 0 noAssert {Boolean} 默认:false 返回:{Number} 从该 Buffer 指定的带有特定尾数格式(readInt32BE() 返回一个较大 ...

  3. H265

    H265 h265  一.名词 CTU: 编码树单元 CU: 编码单元 PU: 以CU为根,对CU进行划分,一个预测单元PU包含一个亮度预测块PB和两个色度预测块PB. TU: 以CU为根,变换单元T ...

  4. 利用VMware14安装虚拟机(Win7&CentOS6.4)

    安装Win7 https://blog.csdn.net/Yangchenju/article/details/80694597 安装CentOS6.4 https://blog.csdn.net/u ...

  5. 个人作业—Alpha测试

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/3338 这个作业要求在哪里 htt ...

  6. cocos creator 底部按钮touch延迟

    cocos论坛里有这个问题: http://forum.cocos.com/t/ios-touchstart-bug/63367我的引擎版本:"engine_version": & ...

  7. Webpack 快速上手(下)

    杏仁前端开发工程师,代码洁癖症早期,关注前端技术. 由于文章篇幅较长,为了更好的阅读体验,本文分为上.中.下三篇: 上篇介绍了什么是 webpack,为什么需要 webpack,webpack 的文件 ...

  8. 创建100个目录dir1-dir100一键完成

    创建100个目录dir1-dir100将系统中已有文件xxx.txt复制1000份1.txt-1000.txt将文件1-10保存到第一个目录中11-20保存到第三个目录中的形式将所有文件处理完 #!/ ...

  9. LA 3938

    After doing Ray a great favor to collect sticks for Ray, Poor Neal becomes very hungry. In return fo ...

  10. [jzoj 5776]【NOIP2008模拟】小x游世界树 (树形dp)

    传送门 Description 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当他想前往阿瓦隆时发现那里只有圣诞节时才能到达 ...