星海

JVM · 主观题 · 第 33 题

Java 后端开发面试 · 第 33 题

类加载过程分为哪几个阶段?什么情况下会打破双亲委派?

参考答案

1. 加载:按全限定名获取二进制字节流,在方法区生成类的运行时结构,并在堆中生成 Class 对象。
2. 链接:验证(文件格式、元数据、字节码、符号引用是否合法);准备(为静态变量分配内存并赋零值,static final 的编译期常量在这一步直接赋值);解析(把符号引用替换为直接引用)。
3. 初始化:执行 <clinit>,即静态变量赋值语句和静态代码块,JVM 保证这个过程线程安全。这也是静态内部类单例模式的原理。
4. 之后是使用和卸载。
5. 打破双亲委派的场景:SPI(DriverManager 位于核心类库,JDK 8 由启动类加载器、JDK 9 起由平台类加载器加载,父加载器看不到 classpath 上的驱动实现,要借助线程上下文类加载器加载);Tomcat 让每个 Web 应用使用独立的类加载器,先自己加载,以隔离不同应用;OSGi 和热部署。

解析

五个阶段中准备阶段赋零值和初始化执行 clinit 是常考细节。

在线刷这套题:即时判分、错题本、闪卡复习,不用登录就能练。