Java 类加载器都有哪些?
按层级分类:
- 启动类加载器(C++实现, 虚拟机的一部分, 负责加载存放在JDK\jre\lib)
- 拓展类加载器(负责加载JDK\jre\lib\ext目录)
- 应用类加载器(负责加载用户类路径(ClassPath)所指定的类)
为什么tomcat或者skywalking要自己定义加载器?
- 对于skywalking,需要从特定的目录取得java class,因为应用程序一般不会直接引入skywalking的jar包, 相关的agent中的类需要自己加载;
- tomcat为了管理多个web应用程序,为了有效地隔离不同 Web 应用的类加载环境,自定义了类加载。
JVM 类加载的生命周期
-
加载(Loading) :通过类加载器加载字节码文件,生成 Class 对象。
-
链接(Linking) :
- 验证:确保字节码文件的合法性。
- 准备:为静态变量分配内存,初始化为默认值。
- 解析:将符号引用转为直接引用。
-
初始化(Initialization) :执行类的静态初始化代码。
-
使用(Using) :类加载完成后,实例化对象、调用方法等。
-
卸载(Unloading) :当没有引用指向 Class 对象时,JVM 会回收类的元数据并卸载。