JVM相关知识(类加载器篇)

107 阅读1分钟

Java 类加载器都有哪些?

按层级分类:

  1. 启动类加载器(C++实现, 虚拟机的一部分, 负责加载存放在JDK\jre\lib)
  2. 拓展类加载器(负责加载JDK\jre\lib\ext目录)
  3. 应用类加载器(负责加载用户类路径(ClassPath)所指定的类)

为什么tomcat或者skywalking要自己定义加载器?

  1. 对于skywalking,需要从特定的目录取得java class,因为应用程序一般不会直接引入skywalking的jar包, 相关的agent中的类需要自己加载;
  2. tomcat为了管理多个web应用程序,为了有效地隔离不同 Web 应用的类加载环境,自定义了类加载。

JVM 类加载的生命周期

  1. 加载(Loading) :通过类加载器加载字节码文件,生成 Class 对象。

  2. 链接(Linking)

    • 验证:确保字节码文件的合法性。
    • 准备:为静态变量分配内存,初始化为默认值。
    • 解析:将符号引用转为直接引用。
  3. 初始化(Initialization) :执行类的静态初始化代码。

  4. 使用(Using) :类加载完成后,实例化对象、调用方法等。

  5. 卸载(Unloading) :当没有引用指向 Class 对象时,JVM 会回收类的元数据并卸载。