JVM加载过程

什么是JVM类加载

指将编译后的class文件,读到内存中,首先将其放在运行时数据区的方法区内,然后再堆内创建class对象。class对象封装了类在方法区内的数据结构,并提供了访问方法区内的数据结构的接口。

image-20240409215152713

类加载器

自带加载器

自带加载器有三个:

1、启动类加载器:负责加载存放在JDK\jre\lib(JDK代表JDK的安装目录,下同)下,或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库(如rt.jar,所有的java.*开头的类均被Bootstrap ClassLoader加载)。启动类加载器是无法被Java程序直接引用的。

2、扩展类加载器:该加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载DK\jre\lib\ext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。

3、应用程序类加载器:该类加载器由sun.misc.Launcher$AppClassLoader来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

类加载的三种方式

  • 命令行启动应用时候由JVM初始化加载
  • 通过Class.forName()方法动态加载
  • 通过ClassLoader.loadClass()方法动态加载

双亲委派机制

1、一个类加载器收到类加载请求,不会首先自己去加载这个类,而是把请求委托到父类加载器去完成。

2、依次向上。

3、所有类加载请求都会被传递到顶层的启动类加载器中。

4、只有父加载器无法加载该类,才会由子类尝试加载。

image-20240409221650719

类的生命周期

生命周期主要包括7个部分:加载,验证,准备、解析、初始化、使用、卸载

类加载过程:加载,验证,准备、解析、初始化

其中 验证,准备、解析 这三个部分统称为连接

image-20240409223238427

加载,验证,准备、初始化 这四个部分是按顺序发生的,而解析则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。其他阶段是按顺序发生,不一定按顺序结束,通常是相互交叉的混合进行,在一个阶段执行的过程中调用另一个阶段。

加载:查找并加载类的二进制数据

验证:确保被加载类的正确性

准备:为类的静态变量分配内存,并将其初始化默认值

解析:把类中的符号引用转换为直接引用

初始化:到此才开始真正执行Java程序代码,执行类构造器方法的过程