码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JVM——类加载器(JDK8及之前,双亲委派机制)


    目录

    • 1.类加载器的分类
      • 1.实现方式分类
        • 1.虚拟机底层实现
        • 2.JDK中默认提供或者自定义
      • 2.类加载器的分类-启动类加载器
      • 3.类加载器的分类-Java中的默认类加载器
      • 4.类加载器的分类-扩展类加载器
      • 5.类加载器的分类-类加载器的继承
    • 2.类加载器的双亲委派机制

    类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。
    类加载器只参与加载过程中的字节码获取并加载到内存这一部分。在这里插入图片描述

    1.类加载器的分类

    类加载器分为两类,一类是Java代码中实现的,一类是Java虚拟机底层源码实现的

    1.实现方式分类

    1.虚拟机底层实现

    源代码位于Java虚拟机的源码中,实现语言与
    虚拟机底层语言一致,比如Hotspot使用C++。
    加载程序运行时的基础类
    保证Java程序运行中基础类被正确地加载,
    比如java.lang.String,确保其可靠性

    2.JDK中默认提供或者自定义

    JDK中默认提供了多种处理不同渠道的类加载器,
    程序员也可以自己根据需求定制
    继承自抽象类ClassLoader
    所有Java中实现的类加载器都需要继承
    ClassLoader这个抽象类

    类加载器的设计JDK8和8之后的版本差别较大,JDK8及之前的版本中默认的类加载器有如下几种:在这里插入图片描述

    2.类加载器的分类-启动类加载器

    ⚫ 启动类加载器(Bootstrap ClassLoader)是由Hotspot虚拟 机提供的、使用C++编写的类加载器。
    ⚫默认加载Java安装目录/jre/lib下的类文件,比如rt.jar, tools.jar,resources.jar等。
    在这里插入图片描述

    3.类加载器的分类-Java中的默认类加载器

    ⚫ ·扩展类加载器和应用程序类加载器都是JDK中提供的、使用Java编写的类加载器。
    ⚫ 它们的源码都位于sun.misc.Launcher中,是一个静态内部类。继承自URLClassLoader。具备通过目录
    或者指定jar包将字节码文件加载到内存中。
    在这里插入图片描述

    4.类加载器的分类-扩展类加载器

    ⚫ 扩展类加载器(Extension Class Loader)是JDK中提供的、
    使用Java编写的类加载器。
    ⚫ 默认加载Java安装目录/jre/lib/ext下的类文件。在这里插入图片描述

    5.类加载器的分类-类加载器的继承

    ⚫ ·扩展类加载器和应用程序类加载器都是JDK中提供的、使用Java编写的类加载器。
    ⚫ 它们的源码都位于sun.misc.Launcher中,是一个静态内部类。继承自URLClassLoader。具备通过目录
    或者指定jar包将字节码文件加载到内存中。在这里插入图片描述

    2.类加载器的双亲委派机制

    每个Java实现的类加载器中保存了一个成员变量叫“父”(Parent)类加载器,可以理解为它的上级, 并不是继承关系。
    ⚫ 应用程序类加载器的parent父类加载器是扩展类加载器,而扩展类加载器的parent是空。
    ⚫ 启动类加载器使用C++编写,没有上级类加载器。
    ⚫ 在类加载的过程中,每个类加载器都会先检查是否已经加载了该类,如果已经加载则直接返回,否则会将加载请求委派给父类加载器。
    ⚫ 如果类加载的parent为null,则会提交给启动类加载器处理。
    在这里插入图片描述
    ⚫ 如果所有的父类加载器都无法加载该类,则由当前类加载器自己尝试加载。所以看上去是自顶向下尝试
    加载。
    在这里插入图片描述
    ⚫ 第二次再去加载相同的类,仍然会向上进行委派,如果某个类加载器加载过就会直接返回在这里插入图片描述

    双亲委派机制指的是:自底向上查找是否加载过,再由顶向下进行加载。在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    记一次长连接断开排查过程
    如何实现MongoDB数据的快速迁移?
    Python爬虫入门:如何设置代理IP进行网络爬取
    Linux输出重定向 >> 文件 2>&1
    Spring容器启动流程是怎样的?
    如何做思维导图?用这两个软件就可以了
    MybatisPlus 实体类与数据库表映射关系&MybatisPlus:ORM思想
    Java学习之封装
    写在最后【mysql高级】【java提高】
    Influence Matters 成立印度尼西亚办公室,构建北亚及东南亚服务中心
  • 原文地址:https://blog.csdn.net/qq_59708493/article/details/134428735
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号