前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM系列(三):双亲委派机制笔记

JVM系列(三):双亲委派机制笔记

作者头像
IT技术分享社区
发布2022-05-24 15:22:07
2K0
发布2022-05-24 15:22:07
举报
文章被收录于专栏:IT技术分享社区

今天给大家分享JVM系列之双亲委派机制相关的知识。

1、Java类加载的过程

Java类的加载过程是动态的,它不会一次性把程序所有的类全部加载后再运行,而是先保障程序运行的基础类加载到JVM虚拟机当中,其他的类,一般是再需要的时候才会去加载,这样的运行机制也达到了节约内存的目的。

当JVM虚拟机加载某个class文件的时候,采用的是双亲委派模式(任务委派模式),就是将请求交给父类去处理。

2、类装载的方式

隐式装载:程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到JVM中。

显式装载:通过class.forName()等方法,显式加载需要的类

3、双亲委派机制的概念

双亲委派机制是指当一个类加载器收到某个类加载请求时,该类加载器首先会把请求委派给父类加载器。每个类加载器都是如此,它会先委托父类加载器在自己的搜索范围内找不到对应的类时,该类加载器才会尝试自己去加载。

4、双亲委派模式的工作流程

Application ClassLoader 收到一个类加载请求时,首先它自己不会先去尝试加载这个类,而是先将这个加载请求委派给父类加载器Extension ClassLoader去加载。

如果Extension ClassLoader收到一个类加载请求时,先将加载请求委派给父类加载器Bootstrap ClassLoader去完成。

如果Bootstrap ClassLoader加载失败(在<JAVA_HOME>\lib中未找到所需类),就会让Extension ClassLoader尝试加载,如果加载成功了就不再让Extension ClassLoader加载,过程结束。

如果Extension ClassLoader也加载失败,就会使用Application ClassLoader加载如果加载成功了就不再让Application ClassLoader加载,过程结束。

如果Application ClassLoader也加载失败,就会使用自定义加载器去尝试加载。

如果所有的加载都失败了,就会抛出ClassNotFoundException异常。

理解:执行的情况都是由Bootstrap ClassLoader先加载,失败了轮到Extension ClassLoader加载,再失败了轮到Application ClassLoader,最后轮到自定义加载器加载。一般情况下大家写的java程序都是Application ClassLoader进行加载的。

5、双亲委派模型的核心代码

代码语言:javascript
复制
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
    synchronized (getClassLoadingLock(name)) {
    // 首先,检查这类是否已经被加载过了
        Class<?> c = findLoadedClass(name);
        if (c == null) {
            long t0 = System.nanoTime();
            try {
                if (parent != null) {
                    //如果存在父类加载器,则取找该类的父类加载器
                    c = parent.loadClass(name, false);
                } else {
                    //返回由引导类加载器加载的类;如果未找到,则返回 null。
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
                // 如果父类加载器抛出ClassNotFoundException异常
                // 则说明父类加载器无法完成加载请求
            }

            if (c == null) {
                // 在父类加载器无法加载时
                // 再调用本身的findClass方法来进行加载
                long t1 = System.nanoTime();
                c = findClass(name);

                // 这是定义类加载器;记录统计数据
                sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                sun.misc.PerfCounter.getFindClasses().increment();
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }
}

6、双亲委派机制的作用

防止加载同一个class文件。通过委托的方式去询问父级是否已经加载过该class,如果加载过了就不需要重新加载。从而保证了数据安全。

通过委托的方式,保证Java核心class不被篡改,即使被篡改也不会被加载,即使被加载也不会是同一个class对象,因为不同的加载器加载同一个.class也不是同一个Class对象。这样则保证了Class的执行安全。

IT技术分享社区

个人博客网站:https://programmerblog.xyz

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小明互联网技术分享社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、Java类加载的过程
  • 2、类装载的方式
  • 3、双亲委派机制的概念
  • 4、双亲委派模式的工作流程
  • 5、双亲委派模型的核心代码
  • 6、双亲委派机制的作用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档