类加载器

 2024-05-25    0 comment    126 browse

jvm

类生命周期

加载

(1)根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息

(2)类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中,方法区中生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息

(3)Java虚拟机同时会在堆上生成与方法区中数据类似的java.lang.Class对象,作用是在Java代码中去获取类的信息以及存储静态字段的数据

连接

验证

验证的主要目的是检测Java字节码文件是否遵守了《Java虚拟机规范》中的约束。这个阶段一般不需要程序员参与。

准备

为静态变量(static)分配内存并设置初值

解析

将常量池中的符号引用替换为直接引用

初始化

执行字节码文件中clinit(class init 类的初始化)方法的字节码指令,包含了静态代码块中的代码,并为静态变量赋值。

使用

包括方法调用、变量操作、控制流程等。类的实例化、调用静态方法等方式都是在这个阶段进行的

卸载

类实例的垃圾回收:当类的实例被垃圾回收器回收时,会标记该类实例为不再使用。

类的引用计数为零:当类的所有实例都不再被引用时,类的引用计数为零。

类的类加载器被回收:当类的类加载器不再被引用时,类的类加载器被回收。

类的卸载:当类的引用计数为零且类的类加载器被回收时,JVM会卸载该类,释放类占用的内存。

类加载器

分类

启动类加载器

由Hotspot虚拟机提供的、使用C++编写的类加载器、默认加载Java安装目录/jre/lib下的类文件

扩展类加载器

使用Java编写的类加载器、默认加载Java安装目录/jre/lib/ext下的类文件

应用程序类加载器

使用Java编写的类加载器、默认加载的是项目中的类以及通过maven引入的第三方jar包中的类

双亲委派机制

向上查找

向下加载

打破双亲委派机制

自定义类加载器并且重写loadClass方法。Tomcat通过这种方式实现应用之间类隔离