「 JVM基础 」Java双亲委派机制
Java的双亲委派机制
参考&鸣谢
Dream_ling、
weixin_39610188、
JVM底层原理解析
文章目录
- Java的双亲委派机制
- 一、介绍
- 二、什么是双亲委派机制
- 三、双亲委派模型工作流程
- 四、代码验证
- 五、双亲委派机制优势
一、介绍
Java虚拟机对class文件采用的是按需加载的方式,
也就是说当需要使用该类时才会将它的class文件加载到内存生成的class对象。
而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式。
即把请求交由父类处理,它是一种任务委派模式。
二、什么是双亲委派机制
当某个特定的类加载器它在接到需要加载类的请求时,这个类会首先查看自己已加载完的类中是否包含这个类,如果有就返回,没有的话就会把加载的任务交给父类加载器加载,以此递归,父类加载器如果可以完成类加载任务,就返回它,当父类加载器无法完成这个加载任务时,才会不得已自己去加载。这种机制就叫做双亲委派机制。
三、双亲委派模型工作流程
1.当Application ClassLoader
收到一个类加载请求时,他首先不会自己去尝试加载这个类,而是将这个请求委派给父类加载器Extension ClassLoader
去完成。
2.当Extension ClassLoader
收到一个类加载请求时,他首先也不会自己去尝试加载这个类,而是将请求委派给父类加载器Bootstrap ClassLoader
去完成。
3.如果Bootstrap ClassLoader
加载失败(在<JAVA_HOME>\lib中未找到所需类),就会让Extension ClassLoader
尝试加载。
4.如果Extension ClassLoader
也加载失败,就会使用Application ClassLoader
加载。
5.如果Application ClassLoader
也加载失败,就会使用自定义加载器去尝试加载。
6.如果均加载失败,就会抛出ClassNotFoundException
异常。
例子:
当一个Hello.class这样的文件要被加载时。不考虑我们自定义类加载器,首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了。如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法。父类中同理会先检查自己是否已经加载过,如果没有再往上。注意这个过程,直到到达Bootstrap classLoader之前,都是没有哪个加载器自己选择加载的。如果父加载器无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException。
四、代码验证
通过查看最顶层父类ClassLoader的loaderClass方法,我们可以验证双亲委派机制。
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 {// 此时是最顶级的启动类加载器c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// 抛出异常说明父类无法加载}if (c == null) {//父类无法加载的时候,由子类进行加载。// to find the class.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;}}
五、双亲委派机制优势
避免类的重复加载
当自己程序中定义了一个和Java.lang包同名的类,此时,由于使用的是双亲委派机制,会由启动类加载器去加载
JAVA_HOME/lib
中的类,而不是加载用户自定义的类。此时,程序可以正常编译,但是自己定义的类无法被加载运行。保护程序安全,防止核心API被随意篡改。通过委托方式,不会去篡改核心.class,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。
「 JVM基础 」Java双亲委派机制相关推荐
- 什么是java双亲委派机制
什么是双亲委派机制 在介绍双亲委派模型之前先说下类加载器.对于任意一个类,都需要由加载它的类加载器和这个类本身统一确立在 JVM 中的唯一性,每一个类加载器,都有一个独立的类名称空间.类加载器就是根据 ...
- JVM - 彻底理解打破双亲委派机制
文章目录 Pre 双亲委派 何为打破双亲委派 如何打破双亲委派 演示 重写 ClassLoader#loadClass 失败原因探究 临时解决办法 验证是否成功 应用下新建Boss1类 自定义加载路径 ...
- Java双亲委派机制
1.什么是双亲委派? 虚拟机在加载类的过程中需要使用类加载器进行加载,而在Java中,类加载器有很多,那么当JVM想要加载一个.class文件的时候,到底应该由哪个类加载器加载呢? 这就不得不提到&q ...
- android双亲委派机制,3分钟了解Java双亲委派机制
你得先知道 在介绍双亲委派机制的时候,不得不提 ClassLoader .说ClassLoader之前,我们得先了解下Java的基本知识. Java是运行在Java的虚拟机(.class 的 JVM中 ...
- 简单的Java双亲委派机制
双亲委派机制 Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,而且加载某个类的class文件时,Java虚拟机采用的 ...
- java 委托_面试官:java双亲委派机制及作用
什么是双亲委派机制 当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类. 类加载器的类别 Bootst ...
- JAVA 双亲委派机制
最近突然看到了关于Java的双亲委派机制,作为一个搞Java的程序猿还是应该知道是怎么回事. 我用一个程序来简单说明是怎么回事吧 package java.util;/*** 本类中的main方法不会 ...
- java 双亲委派机制为什么叫“双亲”
了解了双亲委派机制是什么之后,一直纠结为什么这里要叫"双亲",于是乎上网查了一些资料,大部分都说是翻译的问题,除此之外,其中一篇博客中提到了另一种见解,可以作为参考理解. &quo ...
- Java双亲委派机制在Android的应用
Java的双亲委派机制 三层类加载器 1.启动类加载器(Bootstrap Class Loader) 这个类加载器负责加载存放在<JAVA_HOME>\lib目录,或者被-Xbootcl ...
最新文章
- 测试中如何管理外包质量_如何从测试自动化中实现价值
- 一篇文章让你了解区块链技术的发展阶段
- Spring Boot 集成 Activiti
- hyper服务器虚拟网卡和实际网卡,Hyper-V 3 虚拟网卡带宽应用限制
- 腾讯视频怎么开启运营商网络自动播放
- 五种常见粗粮的最佳养生吃法
- 打通版微社区(5):部署DZ3.2
- 编译原理完整学习笔记(八):目标代码生成
- 外卖侠使用教程【干货】
- SourceInsight查看java源代码
- 计算机开机界面图片怎么修改,电脑win7系统怎么修改开机画面的方法
- ISO 9001是什么?ISO 9001 质量管理体系详细介绍
- RCC BUCK变压器设计
- 首发|罗振宇2018“时间的朋友”跨年演讲未删减全文
- Python游戏概率保底算法PRD的实现
- 高盛:人工智能报告中文版
- 程序员可以通过软考来办理北京户口,成为北京人
- 如何全面欣赏一场时装秀?
- Contest3121 - 2021级新生个人训练赛第26场_问题 F: 乐乐的数字
- 二进制(一):由来及简介