JVM中java类的载入时机
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类的载入时机的更多相关文章
- JVM中java类的加载时机(转载:http://blog.csdn.net/chenleixing/article/details/47099725)
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制.类从被加载到虚拟机内存中开始,到卸载出内 ...
- JVM:Java 类的加载机制
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验,转换,解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制. 类的生命周期 类从被加载到虚拟机内 ...
- hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化
hibernate映射文件??.hbm.xml配置映射元素详解--Hibernate映射类型 在从Hibernate的java的成员类型映射到SQL中的数据类型,其内映射方式它满足,SQL可以自己调制 ...
- MyEclipse2014中Java类右键Run as没有JUnit Test
Java初学,想试试连接本地数据库,按照百度经验中的方法,在最后执行测试的卡住了,为啥?因为MyEclipse中右键Run as没有JUnit Test选项! 6.1.测试数据库mysql是在项目中连 ...
- Maven项目中java类报错-Cannot resolve symbol
电脑蓝屏了,强制重启之后再打开IDEA里面的项目,所有Java类文件都在报Cannot resolve symbo错误,可以确定所有依赖的包都有引用且jar包没有冲突. 经查询找到这个解决方法: 在I ...
- JVM中java实例对象在内存中的布局
普通的Java对象实例 和 Java数组实例.Java数组实例的对象头多了一个数组的长度.Java虚拟机可以通过普通java对象的元数据来确定java对象的大小,但是从数组的元数据中却无法确定数组的 ...
- JVM中存储类信息的三个表格
摘自:<Java Performance>第三章 Internal Class Loading Data The HotSpot VM maintains three hash table ...
- IntelliJ IDEA中Java类注释
打开Idea,依次选择File-->Settings-->Editor-->File and CodeTemplates ,右侧tab选项卡点击Includes,选择File Hea ...
- Android Studio使用过程中Java类突然报红,但项目可运行解决方案
1.点击File->Invalidate Caches / Restart... 2.重启Gradle,清除缓存 3.Clean Project
随机推荐
- Rocky(模拟)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2718 题意:如果没有障碍就按原方向直走,否则就 ...
- Chrome 最小化恢复之后部分黑屏
解决办法:设置->显示高级设置->关闭硬件加速
- 微信图片不可显示java解决方法
先看知乎:https://www.zhihu.com/question/35044484 场景: 微信上传了图片素材,返回了图片url,然后不能在img标签中正常显示. 原因是微信做了图片防盗连接. ...
- net .异步委托知识
以前在编程中,异步用的比较少,导致C# 一些基础的 东西用法都不怎么熟悉,经常要用的时候在去查找资料比较被动,而已没真正里面理解起来,始终感觉不是自己的知识 (题外话) 首先委托关键字 Delega ...
- 关于SSL证书配置、升级的一些问题总结
SSL会成为网站.APP.小程序(小程序已经强制使用https)等项目的标配.关于SSL证书安装使用的问题今天总结下,以备用. 环境配置:windows server 2008 R2和IIS7.0 1 ...
- 关于c# winform使用FidderCore.dll 遇到的一些问题,请求支援
小弟最近再研究winform用fidder抓取包的过程.开始都很顺利,并且成功开启了代理网络.同时手机也设置代理,并且手机可以上网,而且电脑也能抓到手机的请求. 但是遇到两个问题. 1.,这里的关闭代 ...
- C# MVC 延时
[System.Runtime.InteropServices.DllImport("kernel32.dll")] static extern uint GetTickCount ...
- Hotel 旅馆 题解(From luoguBlog)
考试前深陷分块泥潭所以刚开始以为是分块. 然而这题数据水到暴力卡常都能AC 正解:万物皆可线段树 节点存储区间长度.区间最长连续空房长度.从左往右最长连续空房长度.从右往左最长连续空房长度. 维护后三 ...
- Java-Class-Test:Test-1
ylbtech-Java-Class-Test:Test-1 1.返回顶部 1.1. package com.ylbtech.api; import com.y;btech.WxApiApplicat ...
- Log4net日志发布到服务器上日志无法写入
log4net在本地执行时候,日志正常写入,但是发布到服务器上的时候,日志就无法正常写入 解决方案: 1.文件权限 在发布到服务器上的时候,可能文件没有写入权限,导致日志无法正常写入 打开IIS 找到 ...