1 双亲委派机制

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

1.1 工作原理

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


举例:

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 类的方式都被看作是对类的被动使用,都不会导致类的初始化

初始化:

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

  1. 【JVM】类加载器:双亲委派机制、沙箱安全机制

    · 双亲委派机制.沙箱安全机制是JVM中类加载器系统的相关术语 · 在这之前,应该先了解JVM类加载器系统的相关概念 一.类加载器基础知识 见下图1,java文件首先会被编译成class文件,clas ...

  2. JVM-白话聊一聊JVM类加载和双亲委派机制源码解析

    文章目录 Java 执行代码的大致流程 类加载loadClass的步骤 类加载器和双亲委派机制 sun.misc.Launcher源码解析 Launcher实例化 Launcher 构造函数 双亲委派 ...

  3. 类加载器-双亲委派机制

    上一篇:类加载器-分类 一.概述 除了根类加载器之外,其他的类加载器都需要有自己的父加载器.从JDK1.2开始,类的加载过程采用双亲委派机制,这种机制能够很好的保护java程序的安全.除了虚拟机自带的 ...

  4. Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...

  5. 类加载的双亲委派机制

    类加载器的双亲委派机制 ​ 除了根类加载器之外,其他的类加载器都需要有自己的父加载器.从JDK1.2开始,类的加载过程采用双亲委派机制,这种机制能够很好的保护java程序的安全.除了虚拟机自带的根类加 ...

  6. JVM入门(位置、体系结构、类加载器、双亲委派机制、沙箱安全机制、Native、PC寄存器、方法区、堆(新生区{伊甸园区、幸存区}、养老区、永久区)、OOM、GC算法、JMM)

    目录 一.JVM的位置 二.JVM的体系结构 三.类加载器 1.类加载器举例 2. JVM中提供了三层的ClassLoader 3. 双亲委派机制(重要) 3.1 工作原理 3.2.优点 四.沙箱安全 ...

  7. java类加载-ClassLoader双亲委派机制

    "类加载体系"及ClassLoader双亲委派机制.java程序中的 .java文件编译完会生成 .class文件,而 .class文件就是通过被称为类加载器的ClassLoade ...

  8. 关于类加载的双亲委派机制简单总结

    前言 我们知道,一个编译后的class文件,想要在JVM中运行,就需要先加载到JVM中.而做这个工作的老哥就是类加载器.而通过类加载器,加载类文件的具体方式被称为双亲委派机制. 什么是类加载器?有哪些 ...

  9. java 委派关系_一文读懂java类加载之双亲委派机制

    一个编译后的class文件,想要在JVM中运行,就需要先加载到JVM中.java中将类的加载工具抽象为类加载器,而通过加载工具加载类文件的具体方式被称为双亲委派机制. 知识点 类加载器:通过一个类全限 ...

最新文章

  1. php开发我的世界插件,WorldEdit/开发与API
  2. 计算机网络笔记整理图片,计算机网络高分笔记整理(2)
  3. 使用 ASP.NET 配置类
  4. oracle的OCI目录下没有samples包的解决方案
  5. Apache Spark软件包,从XML到JSON
  6. 奔跑吧Linux内核初识
  7. 如何关闭线程池?会创建不会关闭?调用关闭方法时线程池里的线程如何反应?
  8. scanf 输入十六进制_使用C语言中的scanf()在字符变量中输入十进制,八进制和十六进制值...
  9. PXF webapp is inaccessible but tomcat is up
  10. 2019届互联网校招本科薪酬清单
  11. loma 281 - 保险与年金
  12. STM32电机测速(正交或者霍尔编码器)
  13. 使用python实现短信,邮箱的功能
  14. oracle中不等于怎么表示,sql语句不等于怎么表示
  15. 如何安装GCC编译器
  16. GIT TAG 批量删除
  17. Turf.js 地理空间分析库简介
  18. php写火车头采集接口,火车头discuz6.1完美采集的php接口文件
  19. 算法学习:高精度加法//c++
  20. 微软飞行模拟器android,微软飞行模拟器2020

热门文章

  1. crontab 日志_liunx 中定时清理过期日志文件
  2. lvs负载均衡—ldirectord(DR模式的健康检查)
  3. Linux 金字塔 的shell命令,linux下保留文件系统下剩余指定数目文件的shell脚本
  4. 查询2021高考成绩位次,云南一分一段表查询2021-云南高考位次查询(文科、理科)...
  5. Java LineNumberReader getLineNumber()方法及示例
  6. c#官方推荐md5通用加密类
  7. Docker Consul 安装及使用服务发现
  8. mfc获取子窗口句柄_前端设计-JavaScript中父窗口与子窗口间的通信
  9. mysql安装mac 压缩包_MAC mysql安装及设置
  10. linux安装python27_linux下安装python27 nginx 和uwsgi