受多种状况的影响,又开始看JVM 方面的知识。java
一、Java 实在过于内卷,无法不往深了学。面试
二、面试题问的多,被迫学习。安全
三、纯粹的好奇。 很喜欢一句话:“八小时内谋生活,八小时外谋发展。”markdown
--- 望别日与君相见时,君已有所成。学习
共勉
测试
封面地点
:湖南--小城市邵阳spa
做者
:博主 🤸♂️code
@[TOC](双亲委派机制 详解(手画详图)面试高频 你值得拥有!!!)orm
双亲委派机制是当类加载器须要加载某一个.class字节码文件时,则首先会把这个任务委托给他的上级类加载器,递归这个操做,若是上级没有加载该.class文件,本身才会去加载这个.class。这是一种任务委派模式。递归
用一个小故事来加深你们的印象:
一、你看到餐桌上有个鸡腿,看到麻麻很是幸苦。你就说:麻麻你次这个鸡腿吧。麻麻又看到桌上的奶奶,就讲妈:次这个鸡腿补补身子吧。奶奶高兴的说:我媳妇孝顺啊,我今天也来尝尝这个孝顺味道的鸡腿啦。
二、你看到餐桌上有个鸡腿,看到麻麻很是幸苦。你就说:麻麻你次这个鸡腿吧。麻麻又看到桌上奶奶在,就讲妈:次这个鸡腿补补身子把。奶奶高兴的说:我媳妇有这个孝顺心就行了,你天天上班次外卖,对身体很差,这个鸡腿给你次。麻麻拿到手上,又反手把鸡腿夹给我,讲:这个鸡腿仍是得你次,你如今正在长身体,不补一补长不高。⛹️♂️
==这就是双亲委派机制,不知道看完这个餐桌小故事,你们有没有懂勒。==
我在我本身的项目中建立了 一个java.lang
的包 ,而后建立了一个 String 类。
再准备一个测试类,引用这个String类。
String 类 里面就一个静态代码块。
代码能够运行,输出以下:
并无输出个人String 里面的static 静态代码块,证实使用的仍然是 jdk 自带的。
缘由是什么呢?
一步一步分析。
咱们自定义一个类,你要想加载的话,应该是用 Application ClassLoader(系统类加载器、应用程序加载器)进行加载。可是这个时候又牵扯到了 双亲委派机制。
一、当咱们要加载这个自定义String时,
二、先是让应用程序加载器(Application ClassLoader)加载,可是发现它上面还有扩展类加载器(Extension ClassLoader)
三、接着委托给扩展类加载器(Extension ClassLoader),忽然发现它上面还有Bootstrap ClassLoader (启动类加载器)
四、就又接着委托到了Bootstrap ClassLoader (启动类加载器)。启动加载器一看,这不是 java.lang 包下的吗,这是个人任务啊,急忙把他加载啦,而后成功返回。因此这里使用的 new String() 实际使用的仍是 java 中 String。
这样子能够防止什么样问题的发生呢?
你想啊,你写了一个项目,里面用了Jdk 核心类,像String.java,Integer.java,Date.java这种核心类,若是这种核心类可以被随意更改,第1、这颇有可能致使整个项目的崩溃,第2、会影响到Java 虚拟机的稳定性。
确保Java核心类库的安全
:全部的Java应用都至少会引用java.lang.Object类,也就是说在运行期,java.lang.Object类会被记载到Java虚拟机当中;若是这个加载过程是由Java应用本身的类加载器所完成的,那么可能会在JVM中存在多个版本的java.lang.Object类,并且这些类仍是不兼容的、相互不可见的(由于命名空间的缘由)。借助父亲委托机制,Java核心类库中的类的加载工做都是由启动类加载器来统一完成的,从而确保了Java应用所使用的都是同一个版本的Java核心类库,他们之间是互相兼容的。确保Java核心类库提供的类不会被自定义的类所替代
。不一样的类加载器能够为相同名称(binary name)的类建立额外的命名空间
。相同名称的类能够并存在Java虚拟机中,只须要用不一样的类加载器来加他们便可,不一样类加载器所加载的类是不兼容的,这就至关于在Java虚拟机内部建立了一个又一个相互隔离的Java类空间。.class
。经过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。划水的一篇哈,咱们都加油,放肆爱!!!
让咱们一块儿走到最后吧
共勉