上一节我们简单了解了jvm类加载器的步骤并详细分析了jvm类加载步骤的详细细节,本节将会接着讲述关于双亲委派机制的细节。双亲委派机制是jvm一个类加载的重要加载机制,它是jvm的类继承结构的底层设计也是jvm类加载的核心步骤,我们通常使用的tomcat对于双亲委派机制进行了破坏这也是需要了解的内容。
下面是书中jvm虚拟机执行引擎的内容概括:
虚拟机和类加载机制概述
掌握双亲委派模型
三层模型
启动加载器
扩展类加载器
破坏:在jdk9中转化为平台加载器
应用程序类加载器
Osgi模型
什么是类加载器
了解类加载器的作用
关于类加载器的实际应用
java模块化对双亲委派模型的影响
类加载的六个步骤
加载
连接
验证
准备
解析
初始化
使用
卸载
下面是对应的幕布思维导图地址:类和类加载器 - 幕布 (mubu.com)
在本系列的第一篇我们讲述了类加载器是加载类的核心,当我们写好的java文件被jvm虚拟机编译为.class文件并且加载到jvm虚拟机当中转为字节码指令,通过执行字节码指令完成我们编写的程序。一个类要被加载首先需要被jvm认识才行,而认识它就是靠的类加载器,类加载器毫无疑问就是来加载类的。
书中给了一个自定义类加载器的案例,这里直接贴过来了。这个类加载器所做的事情就是简单的构建一个类加载,但是在最后进行instanceof的操作的时候,发现结果是false,这是因为类加载器加载的类是自定义的,而不是jvm程序生成的类。
这里也可以认为如果有自定义加载器,则在进行类加载器判断的时候,需要进行“加载”的操作。因为在这里它存在 两个加载器。
public class ClassLoaderTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
ClassLoader myLoader = new ClassLoader() { @Override
public Class<?> loadClass(String name) throws ClassNotFoundException { try {
String fileName = name.substring(name.lastIndexOf(".") + 1)+".class"; InputStream is = getClass().getResourceAsStream(fileName);
if (is == null) {
return super.loadClass(name); }
byte[] b = new byte[is.available()]; is.read(b);
return defineClass(name, b, 0, b.length);
} catch (IOException e) {
throw new ClassNotFoundException(name);
} }
};
Object obj = myLoader.loadClass("com.headfirst.classloader.ClassLoaderTest").newInstance();
System.out.println(obj.getClass());
System.out.println(obj instanceof com.headfirst.classloader.ClassLoaderTest);
}/*运行结果:
class com.headfirst.classloader.ClassLoaderTest
false
*/
}
双亲委派机制指的是jvm的一种类加载机制,jvm的类加载结构如下图:
结构图如上所示,将分为三层结构,分别是启动类加载器,扩展类加载器和应用程序加载器,这三个加载器首先通过应用程序加载,如果发现无法加载类,则向上委托给父类的扩展类加载器进行加载 ,如果同样加载则继续网上进行请求加载,最后如果顶层启动类也无法加载,这时候又回从顶层向下进行加载,直到自定义加载器可以加载,最后如果都无法加载,则抛出相关的异常。
关于IBM的OSGI
osgi是当初ibm公司为了jdk模块化规范做的一个努力,当然现在早已经被jdk9的模块化取代,当然这也可以说是商业竞争下的一种妥协,最后的结果就是java的模块化和预期效果存在一定的差距,并且虽然还是破坏了双亲委派的机制,但是在整体上依旧能保持基本的类加载器的结构设计。
这让我想到了Jrocket和HotSpot的合并,其实效果远不如官方设计的完美效果,总是要差那么一点。
下面是osgi的运行流程,简单了解即可:
Java双亲委派模型的挑战
双亲委派机制受到过三次挑战(也可以说是四次),由于双亲委派机制是jdk1.2才加入的,为了向前兼容在当时的为了妥协选择了一个不太好的实现就是使用findClass()
的方法进行了重写,但是这个方法在后续的兼容过程中很快就出了问题,如果有基础类型要回调下层的类比如典型的JNDI服务就是如此,这时候为了兼容又只能不太好的设计就是新增一个线程上下文类加载器,这个加载器可以理解为在启动类加载器做了一个插件,如果用户自己实现了这个插件,就会调用客户的代码,否则就会从父类的加载器中进行继承。
这个线程上下文加载器就是tomcat实现破坏双亲委派机制的核心。当然不止tomcat,很多框架也有用到这个线程上下文加载器,在类的加载的阶段“做手脚”。
接着关于程序热替换的挑战了,简单来说就是程序的模块化,关于模块化的内容,在《Java8实战》的书籍里面有简单的理论基础讨论,但是如果要深入模块化,内容有一本书可以来讲,这里也不再赘述关于OSGI和Jisaw的历史了,关于他所做的事情可以看上一个小节。
最后就是Jdk9实现模块化之后的平台类加载器了,这个类加载器基本上算是破坏了JDK的规则,下文会有详细的介绍,如果简单理解这个类加载器就是把之前一直不太优雅的线程上下文加载器通过底层实现了, 也就是说平台类加载器将可以根据模块定义的类加载器进行自定义的加载操作。
最后简单总结上面的内容如下:
模块化之后双亲委派模型变动
撇去模块化对于类加载的其他细节,我们这里直接讲述模块化之后最大的变动:扩展类加载器(Ext)替换为 平台加载器(plaform),主要变化是平台加载器和应用程序加载器不再派生自URLClassLoader
,由于存BootClassLoader
为了兼容旧版的加载器返回null使用上层引导器这一条件,结果不会返回出来。
JDK 9中虽然仍然维持着三层类加载器和双亲委派的架构,但类加载的委派关系也发生了 变动。当平台及应用程序类加载器收到类加载请求,在委派给父加载器加载前,要先判断该类是否能 够归属到某一个系统模块中,如果可以找到这样的归属关系,就要优先委派给负责那个模块的加载器 完成加载,也许这可以算是对双亲委派的第四次破坏?其实从个人看来更像是改变设计不太优雅的“线程上下文加载器”。
总结
本文的内容也比较简单,同样了解即可。重点在于记住双亲委派机制的步骤以及他的工作原理。
写在最后
下篇文章将会针对分派的内容进行讲解,也是jvm非常重要的一部分,通过分派的学习可以对重载、多态、重写有更多的了解。
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/yss3_5h8UxFUHDbzYffx9w
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。