深入java虚拟机(二) 类的加载机制/生命周期

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/heyanfeng22/article/details/62056649

一、类的加载时机

类从被加载到虚拟机到卸载为止,整个生命周期包括:加载、校验、准备、解析、初始化、使用、卸载这几个过程,其中校验、准备、解析这三个过程又称为初始化。严格意义上讲这几个过程并不是按部就班的进行,也会有相互交叉进行,尤其是校验过程,也可能是在初始化阶段之后再开始。

加载 

在加载阶段,虚拟机要完成3件事情:

1、通过类的全名来获取此类的二进制字节流

2、将字节流所代表的静态存储结构转化为方法区的运行时数据结构

3、在内存中生成一个代表这个类的java.lang.Class的对象,作为方法区的这个类的各种数据的访问接口

获取字节流的方法很多:

1、从包中读取

2、从网络中读取,如Applet

3、运行时计算生成,入动态代理技术,java.lang.reflect.Proxy,也就是反射的方式

4、由jsp生成对应Class类

5、从数据库中读取(很少见),如中间件服务器可以把程序安装在数据库中来完成程序代码在集群间转发


数组类不通过类加载器创建,而是通过虚拟机直接创建

1、如果数组类是自定义引用型数组类,则递归加载过程去加载这个组件类型,该数组将在加载该组件类型的类加载器的类名空间上被标识

2、如果是基本类型数组(int[]),虚拟机则会把数组与引导类加载器关联

3、如果是基本类型数组,数组的可见性将默认是public

加载完成以后,二进制字节流存储在方法区,然后在内存中实例化一个java.lang.Class类的对象(一般在堆中,特殊的虚拟机HotSpor存在在方法区中)


验证

验证的目的是保证Class文件的字节流包含的信息符合虚拟机的要求

大致上分为4个验证:文件格式验证、元数据验证、字节码验证、符号引用验证

1、文件格式验证:主要是验证字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理

2、元数据验证:对字节码描述的信息进行语义分析,以保证其描述的信息符合java的语言规范的要求

3、字节码验证:是验证中最复杂的,主要目的是通过数据流和控制流分析,确定程序时候合法、符合逻辑。在元数据信息中的数据类型验证完后,这个阶段对类的方 法体进行验证分析。

4、符号引用验证:这个阶段验证发生在虚拟机将符号引用转化为直接引用的时候,这个转化动作在解析阶段中发生。

  准备

准备阶段是为类变量分配内存并设置初始值(这里说的类变量,也就是静态变量,对应的实例变量是随对象实例化分配在堆内存中),这些内存都在方法区中进 行。

注意:静态变量在准备阶段时是默认值,比如static int a = 123,在准备阶段还是赋值0的,初始化阶段才会赋值123。

如果是常量,也就是final修饰了之后,public static final int a = 123,准备阶段还是赋值为123。 

解析

解析阶段是将常量池的符号引用替换为直接引用的过程

符号引用:指向对象实例的内存地址的引用

直接引用:对象实例的内存地址

初始化

对于初始化,虚拟机严格定义了5种初始化的条件

1、new关键字、get方法调用静态变量、set方法修改静态变量、调用静态方法

2、使用反射方法对类进行调用时

3、子类初始化时检查父类是否初始化,先触发父类初始化

4、执行主类先初始化(通常所说的main方法)

5、当使用jdk1.7的动态语言支持时,如果有一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getstatic、REF_setstatic、REF_invokestatic的方法句 柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化

只有这5中场景的行为称为对一个类进行主动引用。在类的初始化阶段,只会初始化类的静态变量的赋值语句和静态语句,非静态的变量和语句在实例化对象的时候才 会初始化。

除了上述5中情况,其他的所有引用类的方式都不会触发初始化,称为被动引用。

1、引用父类的静态字段,只会引起父类的初始化,而不会引起子类的初始化。

2、定义类数组,不会引起类的初始化。

3、引用类的常量,不会引起类的初始化。

卸载

1、该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。

2、加载该类的ClassLoader已经被回收

3、该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法

这时候,虚拟机会卸载类,并进行垃圾回收

猜你喜欢

转载自blog.csdn.net/heyanfeng22/article/details/62056649
今日推荐