JVM 学习四:类加载之双亲委派机制与沙箱安全机制

1 双亲委派机制

Java 虚拟机对 Class 文件的加载采用的是按需加载的方式,也就是说:当需要使用该类时才会将它的 Class 文件加载到内存生成 Class 对象,而且加载某个类的 Class 文件时,Java 虚拟机采用的是双亲委派模式,即把请求将由父类处理,它是一种任务委派模式。

1.1 工作原理

  1. 如果一个类加载器收到了类加载的请求,它并不会马上自己去加载,而是把这个请求委托给父类的加载器去执行加载
  2. 如果父类加载器还是存在其父类加载器,则进一步向上委托,依次递推,请求最终将到达顶层的启动类加载器
  3. 如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式

在这里插入图片描述
举例:
双亲委派机制 2

1.2 双亲委派机制优势

  • 避免类的重复加载
  • 保护程序安全,防止核心 API 被随意篡改
    • 自定义类:java.lang.String
    • 自定义类:java.lang.GldwolfStart --> 这个类不会被允许加载,因为 java.lang 包下的类是由 Bootstrap ClassLoader 加载的,由于安全原因,不会被加载:java.lang.SecurityException: Prohibited package name: java.lang

2 沙箱安全机制

自定义 java.lang.String 类,但是在加载自定义的 String 类的时候会首先使用引导类加载器加载,而引导类加载器在加载的过程中会先加载 JDK 自带的文件(rt.jar 包中的 java.lang.String.class),而自定义的 java.lang.String 类中有 main 方法,JDK 中的 String 类没有 main 方法,所以会报错说没有 main 方法,就是因为加载的不是自定义的 String 类。这样可以保证对 java 核心源代码的保护,这就是沙箱安全机制

3 其它

在 JVM 中表示两个 Class 对象是否为同一个类存在两个必要条件:

  • 类的完整类名必须一致,包括包名
  • 加载这个类的 ClassLoader(指 ClassLoader 实例对象)必须相同

换句话说,在 JVM 中,即使这两个类对象(Class 对象)来源于同一个 Class 文件,被同一个虚拟机所加载,但是只要加载它们的 ClassLoader 实例对象不同,那么这两个类对象也是不相等的 。

3.1 对类加载器的引用

JVM 必须知道一个类是由启动类加载器加载的还是由用户类加载器加载的,如果一个类是由用户类加载器加载的,那么 JVM 会将这个类加载器的一个引用作为类信息的一部分保存在方法区中。当解析一个类型到另一个类型的引用的时候,JVM 需要保证这两个类的类加载器是相同的。

3.2 类的主动使用和被动使用

Java 程序对类的使用方式分为:主动使用和被动使用

3.2.1 主动使用

主动使用又分为 7 种情况:

  • 创建类的实例
  • 访问某个类或接口的静态变量,或者对该静态变量赋值
  • 调用类的静态方法
  • 反射(比如:Class.forName("top.gldwolf.Test")
  • 初始化一个类的子类
  • Java 虚拟机启动时被标明为启动类的类
  • JDK 7 开始提供的动态语言支持:
    • java.lang.invoke.MethodHandle 实例的解析结果
    • REF_getStatic、REF_putStatic、REF_invokeStatic 句柄对应的类没有初始化,则初始化

3.2.2 被动使用

除了以上 7 种情况,其他使用 Java 类的方式都被看作是对类的被动使用,都不会导致类的初始化

初始化:在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构之线性表:顺序线性表 Java 实现(底层基于数组)

代码实现 package top.gldwolf.java.datastructure.lineartable;/*** 顺序线性表* param <T> 存储的元素类型*/ public class LinearTable<T> {private static final int INITIAL_SIZE 20; // 线性表的初始容量private Object[] data null; // 真正存储数据的数…

Java8新特性:Stream介绍和总结

Java8新特性&#xff1a;Stream介绍和总结 什么是Stream 流&#xff08;Stream&#xff09;是数据渠道&#xff0c;用于操作数据源&#xff08;集合、数组等&#xff09;所生成的元素序列。 集合讲的是数据&#xff0c;流讲的是计算 注意&#xff1a; Stream自己不会存储元素…

数据结构之线性表:单链表

代码实现 package top.gldwolf.java.datastructure.linkedtable;/*** author: Gldwolf* email: ZengqiangZhaosina.com* date: 2020/4/15 12:39*//*** 线性表的链式存储结构** param <T> 存储的数据类型*/ public class LinkedTable<T> {private Node head new N…

使用 Akka 实现 Master 与 Worker 之间的通信

MessageProtocol.scala package top.gldwolf.scala.akkademo.sparkmasterandworker.common/*** author: Gldwolf* email: ZengqiangZhaosina.com* date: 2020/4/17 10:54*//*** 用于 Work 注册时发送注册信息*/ case class WorkerRegisterInfo(id: String, cpu: Int, ram: Int…

URL传Base64 造成报错 Illegal base64 character 20

报错如下&#xff1a; errorInternal Server Error, messageIllegal base64 character 20, tracejava.lang.IllegalArgumentException: Illegal base64 character 20 at java.util.Base64Decoder.decode0(Base64.java:714)atjava.util.Base64Decoder.decode0(Base64.java:714) …

Linux 中使用 sort 指令分组排序详解

Linux 中使用 sort 指令分组排序详解 sort 中进行分组排序主要用到的选项为 -k&#xff0c;此文&#xff0c;我们着重于该选项的使用方式&#xff0c;用到的其它选项不做解释&#xff0c;有兴趣的同学可以查看帮助文档 1. 数据准备 现有数据如下&#xff0c;文件名 sort_so…

Shiro-单点登录原理

单点登录原理 一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构&#xff0c;http作为通信协议。http是无状态协议&#xff0c;浏览器的每一次请求&#xff0c;服务器会独立处理&#xff0c;不与之前或之后的请求产生关联&#xff0c;这个过程用下图说明…

关于 Java 同名类加载顺序问题排查方案

排查背景 最近在生产上部署 UDF 时&#xff0c;遇到一个两个环境完全相同&#xff0c;但是一个客户端报错另一个正常的情况&#xff0c;经过多次调试问题终于得以解决&#xff0c;现将解决思路记录一下&#xff0c;希望能对后来者有所帮助。(生产环境不便于截图。。。暂不展示…

Arrays.asList() 详解

Arrays.asList() 详解 【1. 要点】 该方法是将数组转化成List集合的方法。 List list Arrays.asList(“a”,“b”,“c”); 注意&#xff1a; &#xff08;1&#xff09;该方法适用于对象型数据的数组&#xff08;String、Integer…&#xff09; &#xff08;2&#xff0…

Vim 编码问题详解

Vim 编码问题详解 vim 中有 4 个与编码相关的配置&#xff0c;分别是 encoding、termencoding、fileencoding 和 fileencodings。在实际使用中任何一个配置有问题都可能会导致乱码&#xff0c;因此我们应该清楚每个配置的含义。 1. encoding encoding 是 vim 内部使用的字符编…

@Autowired作用在普通方法上

Autowired作用在普通方法上 Autowired作用在普通方法上&#xff0c;会在注入的时候调用一次该方法&#xff0c;如果方法中有实体参数&#xff0c;会对方法里面的参数进行装配&#xff0c;并调用一次该方法。这个可以用来在自动注入的时候做一些初始化操作。

@Autowired注解作用在方法上

Autowired注解作用在方法上 Autowired注解作用在方法上 &#xff08;1&#xff09;该方法如果有参数&#xff0c;会使用autowired的方式在容器中查找是否有该参数 &#xff08;2&#xff09;会执行该方法

spring定时任务的几种实现方式

spring定时任务的几种实现方式 一&#xff0e;分类 从实现的技术上来分类&#xff0c;目前主要有三种技术&#xff08;或者说有三种产品&#xff09;&#xff1a; Java自带的java.util.Timer类&#xff0c;这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让…

Spring定时任务

Spring定时任务(一)&#xff1a;SpringTask使用 背景&#xff1a;在日常开发中&#xff0c;经常会用到任务调度这类程序。实现方法常用的有&#xff1a;A. 通过java.util.Timer、TimerTask实现。 B.通过Spring自带的SpringTask。 C. 通过Spring结合Quartz实现。本文我们将讲述…

关于Spring 任务调度之task:scheduler与task:executor配置的详解

关于Spring 任务调度之task:scheduler与task:executor配置的详解 其实就是Spring定时器中配置文件中一些配置信息&#xff0c;由于笔者自己是头一次使用&#xff0c;有些配置详细不太明白&#xff0c;随即研究了一番&#xff0c;于是想记录一下&#xff0c;有需要的小伙伴可以…

Spring的任务调度@Scheduled注解——task:scheduler和task:executor的解析

Spring的任务调度Scheduled注解——task:scheduler和task:executor的解析 applicationContext 的配置如下: <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:context"…

CAP 理论、BASE 理论、FLP 理论

CAP 理论、BASE 理论、FLP 理论 CAP 理论、BASE 理论、FLP 理论 1.CAP 理论 C(Consistency) 一致性: 在写操作之后的所有读操作&#xff0c;必须要返回写入的值。 A(Availability) 可用性&#xff1a; 只要收到用户的请求&#xff0c;服务端就必须给出回应。 P(Partitio…

Spring的@Scheduled注解实现定时任务

Spring的Scheduled注解实现定时任务 【简介篇】 项目经常会用到定时任务&#xff0c;实现定时任务的方式有很多种。在Spring框架中&#xff0c;实现定时任务很简单&#xff0c;常用的实现方式是使用注解Scheduled。 Scheduled 常用来实现简单的定时任务。例如凌晨1点跑批&am…

接口测试如何测

接口测试如何测 一.什么是接口&#xff1f; 接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点&#xff0c;定义特定的交互点&#xff0c;然后通过这些交互点来&#xff0c;通过一些特殊的规则也就是协议&#xff0c;来进行数据之间的交互。 二.接口都有哪…

CommandLineRunner 和 ApplicationRunner 的区别

CommandLineRunner 和 ApplicationRunner 概述 CommandLineRunner 和 ApplicationRunner 的作用类似, 都可以在 Spring 容器初始化之后执行某些操作。比较适用于某些复杂的 Bean 加载完成之后执行一些操作。例如 Feign 调用。 相同点 都可以获取到启动时指定的外部参数。主逻…