JVM --- 类的生命周期

一、类的生命周期

加载-----》校验-----》准备-----》解析-----》初始化-----》使用-----》卸载

二、类加载过程

1、加载

(1)主要工作:
通过类的全限定名来获取定义此类的二进制字节流。
将这个类字节流代表的静态存储结构转换为方法区的运行时数据结构。
在堆中生成了一个代表此类的java.lang.Class对象,作为访问这些方法区的数据入口。
(2)支持的两种类加载器:
引导类加载器
用户(加载)自定义类加载器

2、校验

校验作为连接的第一步,用于确保类或接口在二进制表示结构上是正确的。
可分为以下四种验证动作
(1)文件格式验证:验证字节流是否符合Class文件格式规范
(2)元数据验证:对字节码描述的信息进行语义分析,确保其符合java语言规范的要求
(3)字节码验证:确保程序语义是合法的,符合逻辑的
(4)符号引用验证:发生在将符号引用准换为直接引用的时候,确保解析动作能正常执行

3、准备

准备阶段的任务是为类或者接口的静态字段分配空间,并默认初始化这些字段(此时为默认值,在初始化时会给变量赋值)

//age被final修饰,此时age变量被分配内存并赋值为18
public class Student{
    private static final int age = 18;
}
4、解析

解析阶段是将JVM常量池的符号引用替换为直接引用,主要有以下四类:
(1)类或接口的解析 (2)字段解析 (3)类方法解析 (4)接口方法解析

5、初始化

(1)使用了new关键字实例化对象,访问或设置一个类的静态字段(被final修饰),调用类方法,会初始化该静态字段,或者静态方法所在的类。
(2)初始化类的时候,如果其父类没有初始化过,先触发其父类初始化。
(3)虚拟机启动时,先初始化要执行的类(main方法)

三、类加载时机

1、创建类的实例,new一个对象时
2、访问某个类、接口的静态常量、对该静态变量赋值时
3、调用类的静态方法
4、反射
5、初始化一个类的子类(首先初始化子类的父类)
6、JVM启动时标明的类,即文件名和类名相同的子类

四、类加载器

1、类加载器负责加载所有的类,其中所有被载入内存中的类生成一个java.lang.Class实例对象。一旦一个类被加载到JVM中,相同的类就不会被再次载入了。
2、在Java中,一个类用其全限定类名作为标识。
3、JVM预定义中有三种类加载器。当一个JVM启动时,Java开始使用如下类加载器:
(1)根类加载器(启动类加载器)
用来加载Java的核心类,是用原生代码实现的。不继承自java.lang.ClassLoader。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载的引用,所以不允许直接通过引用进行操作。
(2)扩展类加载器:负责加载JRE的扩展目录
(3)系统加载器:启动程序类加载器,负责在JVM启动时加载Java命令。
4、类加载器加载class步骤:
(1)检测当前class是否载入过,即缓冲区内是否有此class,有直接取第(8)步,反之去第(2)步。
(2)如果没有父类加载器,那要么parent是跟类加载器,要么自身是,跳到第(4)步;如果父类加载器存在,进入(3)
(3)请求使用父类加载器去载入目标类,载入成功进入(8),反之执行(5).
(4)请求使用根类加载器去载入目标类,载入成功进入(8),反之执行(7).
(5)当前类加载器尝试寻找class文件,找到执行(6),反之执行(7)
(6)从文件中载入class,成功后进入(8)
(7)抛出ClassNotFoundException异常
(8)返回对应的java.lang.class对象。

五、类加载机制

JVM的类加载机制有以下三种:

1、全盘负责

当一个类加载器负责加载某个class时,该class所依赖和引用的其他class也将由该类加载器负责载入,除非有其他特殊要求

2、双亲委派

先让父类加载器加载该class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类

3、缓存机制

该机制保证所有加载过的class都会被缓存,当程序中需要某个class时,类加载器先从缓存区中搜寻该class;不存在时,系统去读取该类的二进制数据,并将其转化为class对象,存入缓冲区,再重启。


双亲委派机制:

如果一个类加载器收到类加载请求,他不会自己先加载,而是把这个请求委托给父类的加载器去执行。如果父类加载器还存在其父类加载器,则进一步向上委托,依次向上。请求最终会到达顶层的启动类加载器。如果父类加载器能完成类加载任务,就成功返回。如果不行,子加载器就会自己完成加载。
优势:层级关系避免重复加载。


版权声明:本文为qq_43632625原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。