jvm类加载器:双亲委派机制沙箱安全机制(代码片段)

征途黯然. 征途黯然.     2022-12-09     326

关键词:

· 双亲委派机制、沙箱安全机制是JVM中类加载器系统的相关术语
· 在这之前,应该先了解JVM类加载器系统的相关概念

一、类加载器基础知识

    见下图1,java文件首先会被编译成class文件,class文件作为Java虚拟机的可识别文件,编译完成后,需要加载到内存。
    我们针对不同的class文件,会相应用到不同的类加载器。
请添加图片描述

· 引导类加载器Bootstrap ClassLoader,也叫做启动类加载器/根类加载器,并不继承ClassLoader类。引导类加载器使用C/C++语言实现,在Java创立初期,C/C++在速度上占据优势,所以引导类加载器嵌套在JVM内部,用来加载Java核心类库,为Java加速。

· 扩展类加载器Extension ClassLoader,继承了ClassLoader类。上层类加载器为引导类加载器。负责加载JRE的扩展目录,从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK系统安装目录的jre/lib/ext子目录(扩展目录)下加载类库。如果用户创建的jar放在此目录下,也会自动由扩展类加载器加载。

· 系统类加载器Application ClassLoader,也叫做应用程序类加载器,继承了ClassLoader类。系统类加载器主要加载日常开发中开发者自己编写的类。

· 自定义类加载器(狭义)User-Defined ClassLoader,继承了ClassLoader类。狭义上的自定义类加载器,是开发人员自定义的一类加载器。但是从广义上来说,官方在Java虚拟机中规定将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。
    所以说(参考上图1),扩展类加载器、系统类加载器、自定义类加载器(狭义)都算作自定义类加载器。

注意,各个加载器是没有继承关系的,途中的箭头只是逻辑上的一种理解。


二、双亲委派机制

核心解释:
    如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。

举个例子:
    假设我们在项目工程中写一个类叫做java.lang.Integer,此类在加载的时候,由于是我们自己写的,它对应的类加载器是系统类加载器,然后由于双亲委派机制,向上沿此路线传递:系统类加载器 --> 拓展类加载器 --> 启动类加载器,到了启动类加载器的时候,加载了核心类库中的java.lang.Integer。这样就防止了核心类被篡改,也可以防止类被重复加载。

得出双亲委派机制的优点:
    由上例:
    1、安全,可避免用户自己编写的类动态替换Java的核心类,如java.lang.String。,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。

    2、避免全限定命名的类重复加载(使用了findLoadClass()判断当前类是否已加载)。Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次


三、沙箱安全机制

核心解释:
    主要用来防止恶意代码污染java源代码。
    自定义String类,但是在加载自定义String类的时候会率先使用引导类加载器加载,而引导类加载器在加载的过程中会先加载jdk自带的文件(rt.jar包中java\\lang\\String.class),报错信息说没有main方法就是因为加载的是rt.jar包中的String类。这样可以保证对java核心源代码的保护,这就是沙箱安全机制

从源码理解双亲委派机制,原来如此简单(代码片段)

本文,我们介绍类加载机制的几个硬核问题:1从JDK源码级别剖析双亲委派机制原理2自定义类加载器研究如何打破双亲委派机制3.理解Tomcat的沙箱安全机制目录1双亲委派机制介绍2双亲委派机制实现原理3.打破双亲委派机制... 查看详情

jvm进阶之双亲委派机制(代码片段)

...点5.弊端6.注意细节7.破坏示例8.热替换1.概述如果一个类加载器在接收到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父加载器去完成。依次递归,如果父加载器可以完成类加载任... 查看详情

jvm进阶之双亲委派机制(代码片段)

...点5.弊端6.注意细节7.破坏示例8.热替换1.概述如果一个类加载器在接收到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父加载器去完成。依次递归,如果父加载器可以完成类加载任... 查看详情

jvm--类加载器;双亲委派机制;线程上下文类加载器(代码片段)

一、类加载器类加载器就是根据类的二进制名(binaryname)读取java编译器编译好的字节码文件(.class文件),并且转化生成一个java.lang.Class类的一个实例。每个实例用来表示一个Java类,jvm就是用这些实例来... 查看详情

jvm--类加载器;双亲委派机制;线程上下文类加载器(代码片段)

一、类加载器类加载器就是根据类的二进制名(binaryname)读取java编译器编译好的字节码文件(.class文件),并且转化生成一个java.lang.Class类的一个实例。每个实例用来表示一个Java类,jvm就是用这些实例来... 查看详情

jvm技术专题针对于加载器与双亲委派机制分析和研究指南「入门篇」(代码片段)

任何足够先进的科技,都与魔法无异加载器与双亲委派机制类加载器是怎么被创建出来的?什么是双亲委派机制?为什么要有这种机制?Class实例和类加载器究竟是在JavaHeap中,还是在方法区中?类加载器:... 查看详情

双亲委派机制(代码片段)

...码被编译器编译成.class的字节码文件。然后由ClassLoader(类加载器)负责将这些.class文件加载到JVM中去执行。ClassLoaderBootstrapClassLoader(启动类加载器)C++实现在java里无法获取负责加载<JAVA_HOME>/lib下的类ExtensionClassLoader(标准扩... 查看详情

jvm面试总结(代码片段)

...型基于栈式架构的特点基于寄存器式架构特点2.JVM结构-类加载2.1类加载子系统的作用2.2类加载ClassLoader的角色2.3类加载过程2.3.1加载2.3.2链接2.3.3初始化类什么时候初始化类的初始化顺序2.4类加载器的分类2.4.1引导类加载器(启动类... 查看详情

jvm面试总结(代码片段)

...型基于栈式架构的特点基于寄存器式架构特点2.JVM结构-类加载2.1类加载子系统的作用2.2类加载ClassLoader的角色2.3类加载过程2.3.1加载2.3.2链接2.3.3初始化类什么时候初始化类的初始化顺序2.4类加载器的分类2.4.1引导类加载器(启动类... 查看详情

jvm进阶之双亲委派机制(代码片段)

...点5.弊端6.注意细节7.破坏示例8.热替换1.概述如果一个类加载器在接收到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父加载器去完成。依次递归,如果父加载器可以完成类加载任... 查看详情

双亲委派机制(代码片段)

双亲委派机制双亲委派的原理:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委托给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶... 查看详情

jvm--双亲委派机制

要了解双亲委派机制得先了解个概念:类加载器:“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块成为... 查看详情

jvm第六卷---类加载机制(代码片段)

JVM第六卷---类加载机制类加载机制加载链接验证准备解析初始化----<cinit>()V方法发生的时机练习类加载器启动类加载器扩展类加载器双亲委派模式线程上下文类加载器自定义类加载器破坏双亲委派模型的几种做法类加载机制J... 查看详情

双亲委派机制

1.1定义JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器... 查看详情

学妹问我双亲委派机制到底是个什么东西?(代码片段)

1.什么是双亲委派机制?JVM类加载器是有亲子层级结构的,如下图这里类加载其实就有一个双亲委派机制,加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自... 查看详情

jvm(解读java虚拟机)(代码片段)

JVM学习笔记1.JVM整体结构1.1.字节码文件1.2.类加载器1.2.1加载Loading1.2.2链接Linking1.2.3初始化Initialization1.3.运行时数据区RuntimeDataArea1.3.1程序计数器1.3.2虚拟机栈1.3.3本地方法栈1.3.4堆1.3.5方法区(MethodArea)1.4.执行引擎1.4.1解释... 查看详情

jvm----大白话图文之jvm类加载机制内存区域垃圾回收(代码片段)

JVM一、类加载机制1、JVM什么时候会加载一个类?2、验证、准备、解析、初始化过程2.1概念2.2什么时候初始化一个类?3、类加载器和双亲委派机制3.1类加载器3.2双亲委派机制3.3Tomcat类加载机制3.3.1破坏双亲委派二、内存区... 查看详情

jdbc是如何打破双亲委派模式的(代码片段)

...什么JDBC需要打破双亲委派机制JDBC的DriverManager与SPI机制类加载的机制以及双亲委派机制的介绍可以参考JVM类加载机制在JDBC4.0之后,我们不再需要调用Class.https://juejin.cn/post/7007292903361871903为什么JDBC需要打破双亲委派机制JDBC的D... 查看详情