第1篇:JVM运行原理

前言

学习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应用程序不可见。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值