JVM类加载机制过程

97 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

关于class类的加载过程是如何,首先要了解Java虚拟机,Java所有的类在编译的过程中都是依靠JVM虚拟机的,一个class类里面会有普通方法、构造方法、 普通变量、静态变量、普通代码块、静态代码块,如果遇到子类继承父类,那么又涉及到,子类和父类之间的加载顺序。

类加载器组成

1.启动类加载器(Bootstrap ClassLoader

负责Java核心类的加载,其主要核心是java.lang.ClassLoader类加载的顶级类。

2.扩展类加载器(Extension ClassLoader

主要负责JRE 扩展目录(%JAVA_HOME%/jre/lib/ext)下的JAR包的类

3.系统类加载器(Application ClassLoader

负责在JVM启动的时候加载java -classpath系统属性,或者加载classpath环境变量

4.自定义类加载器

可以通过继承ClassLoader类,自定义类加载器。

ClassLoader类加载过程

虚拟机把类从class字节码文件加载到内存,对类进行加载、验证、准备、解析、初始化、使用、销毁这些过程。

分别对这几个过程进行描述

加载

Java文件的虚拟机编译阶段会将.class文件加载到内存中,创建字节码的数组来存储classs文件,在虚拟机中的堆内存中生成一个对应的class对象,这里还是半成品,还是不能用的对象。

验证

接下来要进行字节流规范检查,是否符合虚拟机的规范。 主要分为元数据、字节码、符号引用方面的验证。

准备

为类的static变量分配内存设置初始值,这块主要发生在方法区内,被final和static修饰的变量都是在此阶段进行赋值的。

解析

将类、方法、字段和符号引用转为直接引用,通过指针的方式直接指向,此阶段主要发生在虚拟机常量池中。

初始化

主要对类变量进行初始化,初始化构造器的过程,如果初始化的类还有父类,那么会优先初始化父类,带有static修饰的,静态变量和静态代码块,由上向下依次执行。

双亲委派机制

根本上原因主要是解决类的重复加载问题,多个类之前加载存在父子关系的时候,会将所有类委托给父类去加载,就是Bootstrap ClassLoade 顶层类加载器,如果已经由parent加载器加载,子类加载器再无需加载,只有在父加载器无法加载的时候子类加载器才会尝试加载该类。

F41DF631-DD83-474C-BE75-C67B6379566F.png 核心方法:

D7CEC5A9-1D21-4647-8488-404562D3F8CD.png

破坏双亲委派机制

loadclass是双亲委派机制的核心方法, 如果破坏重写loadclass方法即可,还需要重写findclass。