[读书笔记]Java类载入过程
一. 类的生命周期
类从被载入到虚拟机内存中開始,到卸载出内存为止,有下面(如图)的生命周期:

以上“载入->验证->准备->解析->初始化”称为类的载入过程。
Java虚拟机规范中没有对什么时候须要開始类载入的第一阶段进行强制约束,而是交给了虚拟机依据详细实现来自由把握。
可是对于初始化阶段,虚拟机有下面5种必须对类立即进行“初始化”的情况:
(1)遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,假设类还没初始化就须要立即触发其初始化。
常见场景:使用new实例化对象、读取或设置一个类的静态字段(除了编译器处理了的final字段)以及调用一个类的静态方法时。
(2)使用反射(java.lang.reflect包)对类进行调用时,也会触发类的初始化。
(3)当初始化一个类时,发现父类还未初始化时,要先触发父类的初始化。
(4)当虚拟机启动时,用户须要指定一个运行包括main方法的主类,虚拟机会初始化这个类。
(5)当使用JDK1.7的动态语言支持时,假设一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,触发相应的这个类的初始化。
以上5种场景的行为称为对一个类进行主动引用,除此之外的引用方式将不会触发类的初始化,称为被动引用。
下面是被动引用的一个列子:
class SuperClass
{
static
{
System.out.println("SuperClass init!");
}
public static int value = 123;
}
class SubClass extends SuperClass
{
static
{
System.out.println("SubClass init!");
}
}
public class NotInitialization
{
public static void main(String[] args)
{
System.out.println(SubClass.value);
}
}
输出结果:
SuperClass init!
123
二.类的载入过程
1.载入
载入阶段进行过程:
(1)通过一个类的全限定名获取定义此类的二进制字节流;
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;
(3)在内存中生成一个代表这个类的Java.lang.Class对象,作为方法区这个类的各种数据的訪问入口。
2.验证
验证是为了确保字节流包括信息符合当前虚拟机的要求,而且是安全的。
大概有四个验证阶段
(1)文件格式验证:验证字节流是否符合Class文件格式的规范。
(2)元数据验证:对字节码描写叙述的信息进行语义分析,目的是对类的元数据信息(数据类型)进行语义校验;
(3)字节码验证:对类方法体进行校验分析;
(4)符号引用验证:对类自身以外(常量池中的各种符号引用)的信息进行匹配性校验。
这里能够做一个优化:由于验证阶段耗时还是挺大的,假如已被反复使用多次而且是验证过的代码就可以跳过这个步骤,加快类载入速度。
3.准备
正式为类变量(static)分配内存和设置类变量的初始值,这里的类变量除了被final修饰的。
4.解析
将符号引用替换成直接引用的过程。
5.初始化
运行类构造方法<clinit>()的过程。即static块语句的运行和变量的复制操作。
[读书笔记]Java类载入过程的更多相关文章
- [读书笔记] java类初始化
以下内容来自周志明的<深入理解java虚拟机>: 类初始化阶段是类加载过程的最后一步,前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导 ...
- 《深入了解java虚拟机》高效并发读书笔记——Java内存模型,线程,线程安全 与锁优化
<深入了解java虚拟机>高效并发读书笔记--Java内存模型,线程,线程安全 与锁优化 本文主要参考<深入了解java虚拟机>高效并发章节 关于锁升级,偏向锁,轻量级锁参考& ...
- 深入研究Java类载入机制
深入研究Java类载入机制 类载入是Java程序运行的第一步,研究类的载入有助于了解JVM运行过程,并指导开发人员採取更有效的措施配合程序运行. 研究类载入机制的第二个目的是让程序能动态的控制类载 ...
- Java类载入器 ClassLoader的解析
//參考 : http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类载入器基本概念 类载入器是 Java 语言的一个创新,也是 Ja ...
- java类载入器——ClassLoader
Java的设计初衷是主要面向嵌入式领域,对于自己定义的一些类,考虑使用依需求载入原则.即在程序使用到时才载入类,节省内存消耗,这时就可以通过类载入器来动态载入. 假设你平时仅仅是做web开发,那应该非 ...
- Java类载入器原理分析
一:Java虚拟机中能够安装多个类载入器,系统默认是三个基本的类载入器: Bootstrap ExtClassLoader AppClassLoader 类载入器也是Java类.由于其它Java类 ...
- JVM类载入过程及主动引用与被动引用
了解类载入全过程,有助于了解JVM执行过程,以及更深入了解java动态性(解热部署,动态载入),提高程序灵活性. 类载入全过程: JVM将class文件字节码文件载入到内存中.并对数据进行校验解析和初 ...
- Java类载入器(一)——类载入器层次与模型
类载入器 虚拟机设计团队把类载入阶段中的"通过一个类的全限定名来获取描写叙述此类的二进制字节流"这个动作放到Java虚拟机外部去实现.以便让应用程序自己决定怎样去获取所须要的类 ...
- Java类载入器(二)——自己定义类载入器
用户定制自己的ClassLoader能够实现以下的一些应用: 自己定义路径下查找自己定义的class类文件,或许我们须要的class文件并不总是在已经设置好的Classpath以下,那么我们必须想 ...
随机推荐
- HRBUST 1819 石子合并问题--圆形版
石子合并问题--圆形版 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HRBUST. Original ...
- 【HDOJ 5384】Danganronpa
[HDOJ 5384]Danganronpa AC自己主动机. .. 当时感觉用字典树 标神也往自己主动机想来着..手太生加上时间紧迫也没敲--回来一看题解什么AB同一时候建自己主动机...顿时愣了 ...
- HDU1788 Chinese remainder theorem again【中国剩余定理】
题目链接: pid=1788">http://acm.hdu.edu.cn/showproblem.php?pid=1788 题目大意: 题眼下边的描写叙述是多余的... 一个正整N除 ...
- javascript变量类型及作用域
javascript变量类型及作用域 一.简介 变量类型 ECMAScript变量可能包含两种不同类型的数据值:基本类型和引用类型. 基本类型 基本类型指的是简单的数据段,5种基本数据类型:undef ...
- HDU 1716 排列2
排列2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 前阿里云CTO章文嵩:怎样做开源才有意义?
阿里云CTO章文嵩已于昨日离职,据传加盟滴滴.可靠消息透露,章文嵩在滴滴出行担任的是技术高级副总裁的职位.这样一个身价上亿的技术大牛,是怎么看待开源项目的?InfoQ:关于淘宝-阿里系的开源进程,我们 ...
- 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!
乐高Mindstorm EV3智能机器人(下面简称EV3)自从在2013年的CES(Consumer Electronics Show美国消费电子展)上展出之后,就吸引了全球广大机器人爱好者的眼球!E ...
- 6. oracle学习入门系列之六 模式
oracle学习入门系列之六 模式 上篇咱们学习记录了ORACLE数据库中的数据库结构.内存结构和进程等.篇幅 蛤蟆感觉偏多了.这次要休整下,每次笔记不宜太多,不然与书籍有何差别. 我们要保证的是每次 ...
- Qt 5.11的QChar、QString、QTextBoundaryFinder和双向文本算法现在完全兼容Unicode 10
本文翻译自:Qt 5.11 released 原文作者: Qt公司CTO兼Qt开源项目维护官Lars Knoll翻译校审:Richard.Hongfei.Haipeng 5月22日,我们提发布了Qt ...
- js21---单体(单例)模式
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...