一. 类的生命周期

类从被载入到虚拟机内存中開始,到卸载出内存为止,有下面(如图)的生命周期:



以上“载入->验证->准备->解析->初始化”称为类的载入过程

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块语句的运行和变量的复制操作。

最新文章

  1. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
  2. Linux shell编程
  3. GUID 全局统一标识符的介绍
  4. selenium-JS点击(项目应用)
  5. Adapter 启动时报错——2
  6. MySQL 安装和启动服务,“本地计算机 上的 MySQL 服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。”
  7. JavaScript 语句 数组与冒泡排序法
  8. Xen、Openvz、KVM有什么区别?
  9. iso8583报文自学笔记
  10. Bit,Bytes,KB,MB,GB,TB,PB,EB,ZB,YB
  11. &lt;Win32_8&gt;由浅入深——滚动条
  12. rabbitmq-c初探
  13. 对student进行增删改
  14. JAVA异步加回调的例子
  15. NIPS2017-The neural hawks process
  16. LeetCode算法题-Distribute Candies(Java实现)
  17. re模块基本用法和字符集
  18. kickstart文件制作与光盘镜像制作
  19. 7.2.4 else与if配对
  20. 20165234 《Java程序设计》第八周学习总结

热门文章

  1. 【python 设计模式】单例模式
  2. HRBUST 1818 石子合并问题--直线版
  3. Spring Cloud学习笔记【三】服务消费者Feign
  4. webp学习http://isux.tencent.com/introduction-of-webp.html
  5. php中array_merge函数
  6. js---- localStorage的基本用法
  7. 基于x86平台的Solaris安装视频(时长25分钟)
  8. Gym 100952 A. Who is the winner?
  9. ELK+KAFKA安装部署指南
  10. 洛谷——P2984 [USACO10FEB]给巧克力Chocolate Giving