[JVM] 3. 类加载子系统(2)-- 类加载器、双亲委派机制(JDK1.8及之前)及其他

这篇具有很好参考价值的文章主要介绍了[JVM] 3. 类加载子系统(2)-- 类加载器、双亲委派机制(JDK1.8及之前)及其他。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

JDK1.8及之前和JDK9及之后的双亲委派模型是不一样的,这里学习了1.8及以前的双亲委派模型,记录笔记

一、类加载器

1.8之前主要是这几种类加载器:

1. 启动类加载器(Bootstrap ClassLoader):

  • 负责将存放在<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名,如rt.jar)类库加载到虚拟机内存中。(核心类)
  • 启动类加载器无法被java程序直接引用,用户在编写自定义类加载器时,若需要把加载请求委派给引导类加载器,直接用null代替即可。
  • 加载扩展类和应用程序类加载器,并指定为他们的父加载器
  • 出于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类

        启动类加载器(Bootstrap ClassLoader)是用c/c++实现的,嵌在JVM内部,并不是继承java.lang.ClassLoader。

        启动类加载器(Bootstrap ClassLoader)对Java不可见,获取是null,因此可以通过某一个类的加载器是否为null来判断该类是不是使用BootstrapClassLoader进行加载。

2. 扩展类加载器(Extension ClassLoader):

  • Java语言编写,由sun.misc.Launcher$ExtClassLoader实现。
  • 派生于ClassLoader类
  • 父加载器为启动类加载器(Bootstrap ClassLoader)
  • 从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/1ib/ext子目录(扩展目录)下加载类库。如果用户创建的JAR放在此目录下,也会自动由扩展类加载器加载。

3. 应用程序类加载器(Application ClassLoader):

  • 由sun.misc.Launcher$AppClassLoader实现,是ClassLoader中的getSystemClassLoader()方法的返回值,被称为系统类加载器,负责加载用户类路径(classpath)上所指定的类库。

[JVM] 3. 类加载子系统(2)-- 类加载器、双亲委派机制(JDK1.8及之前)及其他,JVM,jvm,java,开发语言

 启动类加载器是扩展类加载器的父加载器,但是不能说二者是父子类关系。其他加载器的关系也同理。(读作 父 类加载器)

二、双亲委派机制(JDK1.8及之前)

        如果一个类加载器收到了类加载请求,首先它不会尝试加载这个类,而是把这个任务委托给父类加载器,每一层都是这样。因此,所有的加载请求应该都传送到顶层的启动类加载器(Bootstrap ClassLoader)。

        只有当父 类加载器反馈自己无法加载这个类时,子 类加载器才会尝试加载该类。        

[JVM] 3. 类加载子系统(2)-- 类加载器、双亲委派机制(JDK1.8及之前)及其他,JVM,jvm,java,开发语言

优点:

  1. 避免了类的重复加载
  2. 保护了程序的安全性,防止核心的API被修改

三、其他

1. 沙箱安全机制:

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

2. 如何判断两个class对象是否相同:

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

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

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

3. 对类加载器的引用​​​​​​​:

        JVM必须知道一个类型是由启动加载器(Bootstrap ClassLoader)加载的还是由用户类加载器加载的。

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

        

4. 类的主动使用和被动使用:​​​​​​​

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

主动使用,又分为七种情况:

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

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

参考:

面试必问的 JVM 类加载机制,你懂了吗?_程序员囧辉的博客-CSDN博客

双亲委派机制_云飘飘啊的博客-CSDN博客​​​​​​​

2. 类加载子系统 · 语雀

双亲委派机制 - 知乎文章来源地址https://www.toymoban.com/news/detail-586262.html

到了这里,关于[JVM] 3. 类加载子系统(2)-- 类加载器、双亲委派机制(JDK1.8及之前)及其他的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JVM从入门到实战】(六)类加载器的双亲委派机制

    在Java中如何使用代码的方式去主动加载一个类呢? 方式1:使用Class.forName方法,使用当前类的类加载器去加载指定的类。 方式2:获取到类加载器,通过类加载器的loadClass方法指定某个类加载器加载。 双亲委派机制: 自底向上查找是否加载过,再由顶向下进行加载 面试题:

    2024年02月04日
    浏览(38)
  • [JVM] 2. 类加载子系统(1)-- 内存结构、类加载子系统概述

    类加载子系统的职责是:加载class文件到内存中。 完整的内存结构如下: 类加载过程总体分为Loading(加载)、Linking(链接)、Initialization(初始化)三个环节,在Linking阶段又细分为Verification(验证)、Preparation(准备)、Resolution(解析)三个环节。 通过一个类的全限定名获

    2024年02月16日
    浏览(30)
  • jvm-类加载子系统

    类加载子系统负责从文件系统或网络中加载class文件,class文件在文件开头有特定的文件标识 ClassLoader只负责class文件的加载,至于它是否运行,则由Execution Engine决定 加载的类信息存放于一块称为方法区的内存空间,除了类的信息外,方法区中还会存放运行时常量池信息,可

    2024年02月12日
    浏览(31)
  • 【JVM】打破双亲委派机制

           📝个人主页:五敷有你        🔥 系列专栏:JVM ⛺️ 稳中求进,晒太阳 ClassLoader包含了四个核心方法 双亲委派机制核心代码阅读 阅读双亲委派机制的核心代码,分析如何通过自定义类加载器打破双亲委派机制。 打破双亲委派机制的核心就是讲下面的代码重写

    2024年02月19日
    浏览(36)
  • 【jvm】双亲委派机制

    一、说明 1.java虚拟机对class文件采用的是按需加载的方式,当需要使用该类时才会将它的class文件加载到内存生成class对象 2.加载某个类的class文件时,java虚拟机采用双亲委派模式,即把请求交给由父类处理,是一种任务委派模式 3.jvm中表示两个class对象是否为同一个类存在两

    2024年02月11日
    浏览(30)
  • JVM类加载&双亲委派-JVM(二)

    上篇文章说了java类的加载,验证、准备、解析、初始化。类的初始化必须是类加载完才执行,所以类的构造方法初始化是在静态方法之后执行。 JVM类加载机制-JVM(一) 一、类加载和双亲委派机制 前面类加载主要通过类加载器实现,类加载器有这几种: 引导类加载器:负责

    2024年02月11日
    浏览(30)
  • JVM理论(二)类加载子系统

    类加载流程 类加载器子系统负责从文件系统或者网络中加载class文件,class文件的文件头有 特定的文件标识 ( CAFEBABE是JVM识别class文件是否合法的依据 ) classLoader只负责文件的加载,而执行引擎决定它是否被执行 加载类的信息存放在运行时数据区的方法区中,方法区还包括常量池信

    2024年02月13日
    浏览(27)
  • JVM第二篇 类加载子系统

    JVM主要包含两个模块,类加载子系统和执行引擎,本篇博客将类加载子系统做一下梳理总结。 目录 1. 类加载子系统功能 2. 类加载子系统执行过程 2.1 加载 2.2 链接  2.3 初始化  3. 类加载器分类  3.1 引导类加载器  3.2 自定义加载器  3.2.1 自定义加载器实现步骤​编辑  4. 类加

    2024年02月11日
    浏览(30)
  • 类加载 - 双亲委派机制详解

    启动类加载器(Bootstrap Class Loader):它是Java虚拟机的一部分,负责加载Java核心类库,如java.lang包中的类。它是最顶层的类加载器,由C++实现,不是Java类。 扩展类加载器(Extension Class Loader):它负责加载Java的扩展类库,位于JRE的lib/ext目录下。它是由Java编写的类加载器,是

    2024年02月12日
    浏览(31)
  • JVM类加载基本流程及双亲委派模型

    一个运行起来的Java进程就是一个JVM虚拟机,这就需要从操作系统中申请一片内存区域。JVM申请到内存之后,会把这个内存划分为几个区域,每个区域都有各自的作用。 一般会把内存划分为 四个区域 : 方法区 (也称 \\\"元数据区\\\"), 堆区 , 栈区 , 程序计数器 。 (1)方法区:

    2024年04月23日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包