当前位置:首页 >休闲 >JVM优化:双亲委派模型 化双这个函数经常使用

JVM优化:双亲委派模型 化双这个函数经常使用

2024-07-01 02:26:13 [百科] 来源:避面尹邢网

JVM优化:双亲委派模型

作者:日拱一卒程序猿 开发 前端 黑客自定义一个 java.lang.String 类,化双该 String 类具有系统的亲委 String 类一样的功能,只是派模在某个函数 稍作修改。比如 equals 函数,化双这个函数经常使用,亲委如果在这这个函数中,派模黑客加入一些“病毒代码”。化双并且 通过自定义类加载器加入到 JVM 中。亲委此时,派模如果没有双亲委派模型,化双那么 JVM 就可能误以为黑客自定义的亲委 java.lang.String 类是系统的 String

一、什么是派模双亲委派

双亲委派模型工作过程是:如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,化双而是亲委把这个 请求委派给父类加载器完成。每个类加载器都是派模如此,只有当父加载器在自己的搜索范围内找不到指定的类时 (即 ClassNotFoundException ),子加载器才会尝试自己去加载。

JVM优化:双亲委派模型 化双这个函数经常使用

二、为什么需要双亲委派模型?

为什么需要双亲委派模型呢?假设没有双亲委派模型,试想一个场景:

JVM优化:双亲委派模型 化双这个函数经常使用

黑客自定义一个 java.lang.String 类,该 String 类具有系统的 String 类一样的功能,只是在某个函数 稍作修改。比如 equals 函数,这个函数经常使用,如果在这这个函数中,黑客加入一些“病毒代码”。并且 通过自定义类加载器加入到 JVM 中。此时,如果没有双亲委派模型,那么 JVM 就可能误以为黑客自定义的 java.lang.String 类是系统的 String 类,导致“病毒代码”被执行。

JVM优化:双亲委派模型 化双这个函数经常使用

而有了双亲委派模型,黑客自定义的 java.lang.String 类永远都不会被加载进内存。因为首先是最顶端的类加 载器加载系统的 java.lang.String 类,最终自定义的类加载器无法加载 java.lang.String 类。

或许你会想,我在自定义的类加载器里面强制加载自定义的 java.lang.String 类,不去通过调用父加载器不就 好了吗?确实,这样是可行。但是,在 JVM 中,判断一个对象是否是某个类型时,如果该对象的实际类型与待比较 的类型的类加载器不同,那么会返回false。

举个栗子:

ClassLoader1 、 ClassLoader2 都加载 java.lang.String 类,对应Class1、Class2对象。那么 Class1 对象不属于 ClassLoad2 对象加载的 java.lang.String 类型。

三、如何实现双亲委派模型

双亲委派模型的原理很简单,实现也简单。每次通过先委托父类加载器加载,当父类加载器无法加载时,再自己加 载。其实 ClassLoader 类默认的 loadClass 方法已经帮我们写好了,我们无需去写。

几个重要函数

loadClass 默认实现如下:

public Class loadClass(String name) throws ClassNotFoundException {

return loadClass(name, false);

}

再看看 loadClass(String name, boolean resolve) 函数:

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {     synchronized (getClassLoadingLock(name)) {         // First, check if the class has already been loaded        Class c = findLoadedClass(name);        if (c == null) {             long t0 = System.nanoTime();            try {                 if (parent != null) {                     c = parent.loadClass(name, false);                } else {                     c = findBootstrapClassOrNull(name);                }            } catch (ClassNotFoundException e) {                 // ClassNotFoundException thrown if class not found                // from the non-null parent class loader            }            if (c == null) {                 // If still not found, then invoke findClass in order                // to find the class.                long t1 = System.nanoTime();                c = findClass(name);                // this is the defining class loader; record the stats                sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);                sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);                sun.misc.PerfCounter.getFindClasses().increment();            }        }        if (resolve) {             resolveClass(c);        }        return c;    }}

从上面代码可以明显看出, loadClass(String, boolean) 函数即实现了双亲委派模型!整个大致过程如下:

1. 首先,检查一下指定名称的类是否已经加载过,如果加载过了,就不需要再加载,直接返回。

2. 如果此类没有加载过,那么,再判断一下是否有父加载器;如果有父加载器,则由父加载器加载(即 调用 parent.loadClass(name, false); ).或者是调用 bootstrap 类加载器来加载。

3. 如果父加载器及 bootstrap 类加载器都没有找到指定的类,那么调用当前类加载器的 findClass 方 法来完成类加载。

换句话说,如果自定义类加载器,就必须重写 findClass 方法!

findClass 的默认实现如下:

protected Class findClass(String name) throws ClassNotFoundException { throw new ClassNotFoundException(name);}

可以看出,抽象类 ClassLoader 的 findClass 函数默认是抛出异常的。而前面我们知道, loadClass 在父加载 器无法加载类的时候,就会调用我们自定义的类加载器中的 findeClass 函数,因此我们必须要在 loadClass 这 个函数里面实现将一个指定类名称转换为 Class 对象。

如果是读取一个指定的名称的类为字节数组的话,这很好办。但是如何将字节数组转为 Class 对象呢?很简单, Java 提供了 defineClass 方法,通过这个方法,就可以把一个字节数组转为Class对象。

defineClass 主要的功能是:

将一个字节数组转为 Class 对象,这个字节数组是 class 文件读取后最终的字节数组。如,假设 class 文 件是加密过的,则需要解密后作为形参传入 defineClass 函数。

defineClass 默认实现如下:

protected final Class defineClass(String name, byte[] b, int off, int len) throws ClassFormatError { return defineClass(name, b, off, len, null);
责任编辑:武晓燕 来源: 今日头条 JVM优化双亲委派

(责任编辑:娱乐)

    推荐文章
    • 服务在非矿企出运需求 中远海运首次“集改散”业务圆满完成

      服务在非矿企出运需求  中远海运首次“集改散”业务圆满完成近日,中远海运特运杜鹃松轮历经一个月航程,运送紫金矿业1万吨铜精矿抵达防城港,这标志着中远海运(非洲)有限公司服务在非矿企,首次“集改散”业务圆满完成。过去两年来,全球产业链供 ...[详细]
    • “小柯”秀

      “小柯”秀《自然-物理学》科学家揭示材料老化过程中的时间可逆性德国达姆施塔特工业大学Thomas Blochowicz等人揭示了材料老化过程中的时间可逆性。相关研究1月26日发表于《自然-物理学》。研究人员利用 ...[详细]
    • 世界数字教育联盟在上海正式宣布成立

      世界数字教育联盟在上海正式宣布成立转自:红星新闻1月30日,以“数字教育:应用、共享、创新”为主题的2024世界数字教育大会在上海开幕。会议期间,世界数字教育联盟正式宣布成立。联盟发起方代表,中国教育国际交流协会会长刘利民向与会嘉宾介 ...[详细]
    • 糖脂代谢研究重点专项启动

      糖脂代谢研究重点专项启动本报讯记者朱汉斌 通讯员刘小龙)近日,由广东药科大学牵头,国内多家科研机构、高校及企业共同承担的国家重点研发计划“主动健康和人口老龄化科技应对”重点专项“糖脂代谢异常亚健康状态预警及系统有效干预措施研 ...[详细]
    • 美联储加息什么意思 美联储加息对中国股市的影响有哪些?

      美联储加息什么意思 美联储加息对中国股市的影响有哪些?美联储加息什么意思?美联储加息是指联邦储备系统管理委员会在华盛顿召开议息会议后,决定货币政策的调整,是否上调利率。简单的说,加息是一种紧缩型货币政策,美联储通过加息来应对当前的经济。一般加息可以提高银 ...[详细]
    • 与数字人苏东坡互动,“你好,苏东坡——沉浸式宋韵艺术展”将开展

      与数字人苏东坡互动,“你好,苏东坡——沉浸式宋韵艺术展”将开展新春佳节将至,成都传媒集团东郊记忆将以“遇见国潮·新春有‘乐’‘戏’聚烟火”为题,在春节期间举办70余场吉庆红火的特色活动。其中,“你好,苏东坡——沉浸式宋韵艺术展”将于2月2日开展,通过前沿数字艺术 ...[详细]
    • 福建厦门打造海绵城市

      福建厦门打造海绵城市◎本报记者 符晓波 陈 瑜 都 芃 李梦一    抬眼是绿,俯首有花,远处是成群的白鹭……1月24日,记者在福建省厦门市马銮湾新城看到,这里环海湾岸线打造的新城市景观带生态多样、风景如画。    “这 ...[详细]
    • 国家区块链技术创新中心启动重庆中心建设

      国家区块链技术创新中心启动重庆中心建设本报讯记者田瑞颖)1月29日,在国家区块链创新应用试点总结交流会上,国家区块链技术创新中心正式宣布启动建设重庆中心。这是国家区块链技术创新中心布局的首个区域创新中心,将加速区块链关键技术研发,通过构建 ...[详细]
    • 花呗升级和不升级区别在哪里 可用额度会增加吗?

      花呗升级和不升级区别在哪里 可用额度会增加吗?对于很多年轻人来说,无论是在线上的电商平台支付,还是在线下的实体商店支付,使用花呗都是一件比较平常的事情。有不少花呗用户都收到了花呗服务升级提示,花呗升级和不升级区别在哪里?花呗不升级还能用吗?花呗升 ...[详细]
    • 生态环境部:正编制新一轮京津冀协同发展生态环保中长期规划

      生态环境部:正编制新一轮京津冀协同发展生态环保中长期规划转自:红星新闻1月30日,生态环境部举行新闻发布会,介绍2024年全国生态环境保护工作会议、全面推进美丽中国建设等相关情况。会上,生态环境部综合司司长孙守亮表示,《关于全面推进美丽中国建设的意见》对建 ...[详细]
    热点阅读