前言
学习JVM,首先需要了解类的生命周期?以及类加载原理?并且需要扩展知识点,明白什么是双亲委派?如何打破双亲委派?最常见的Web容器Tomcat中的JVM是如何工作的?
一、类的生命周期
编译 -> 加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 ->卸载
二、类加载原理
1、类加载的过程
2、代码示例
public class Kafka {
public static void main(String[] args) {
ReplicaManager replicaManager = new ReplicaManager();
replicaManager.loadReplicasFromDisk();
}
}
public class ReplicaManager {
public static String flushInterval = "hello world";
public static Map<String, ReplicaManager> replicaManagerMap;
static {
replicaManagerMap = new HashMap<>(16);
}
public void loadReplicasFromDisk() {
Boolean hasFinishedLoad = false;
if (isLocalDataCorrupt()) {
}
}
public Boolean isLocalDataCorrupt() {
Boolean isCorrupt = false;
return isCorrupt;
}
}
三、双亲委派原理
1、原理图
2、双亲委派的优点
安全性:若有人恶意篡改系统级别类,如:String.java,则不可能实现,因为该类在BootstrapClassLoader已加载过了;
一致性:若父类加载器已加载过,子类则不会重复加载,保证同一个类只被加载一次(通过ClassLoader+类全限定名来保证)
四、Tomcat类加载机制
总结
1、Tomcat如何打破双亲委派机制:Thread.currentThread().setContextClassLoader(this.catalinaLoader)。默认情况下,Thread上下文加载器继承至父线程,也就是说所有线程默认上下文加载器都与第一个启动线程相同,即main线程,它的上下文加载器是AppCLassLoader。
2、JasperClassLoader只负责加载由JSP编译后生成的类。
3、每个应用都有自己的WebappClassLoader,各个WebappClassLoader实例之间相互隔离,且加载路径中的Class只对当前webapp可见,对Tomcat和其他Web应用程序不可见。