深入分析JVM类加载机制(一)

Java类加载器之间的关系 一、三种类加载器 当 JVM 启动的时候,Java 缺省开始使用如下三种类型的类加载器: 启动(Bootstrap)类加载器:引导类加载器是用 本地代码实现的类加载器,它负责将 <JAVA_HOME>/lib 下面的核心类库 或 -Xbootclasspath 选项指定的 jar 包等 虚拟机识别的类库 加载到内存中。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启... 阅读详情

Java体系中定义了3中类加载器,分别如下:

  • Bootstrap ClassLoader(引导类加载器).负责加载下述3中情况下所制定的核心类库:
  1. %JAVA_HOME%/jre/lib目录
  2. -Xbootclasspath 参数所指定的目录
  3. 系统属性sun.boot.class.path指定的目录中特定名称的jar包
  • Extension ClassLoader(扩展类加载器) 加载扩展类,拓展JVM的类库
  1. %JAVA_HOME%/jre/lib/ext目录
  2. 系统属性java.ext.dirs所指定的目录中的所有类库
  • System ClassLoader(系统类加载器) 加载Java应用程序类库,加载类库的路径由系统环境变量ClassPath、-cp或系统属性java.class.path指定
  • 图中各类加载器之间的关系,并非Java类面向对象的三大特性之一的那种“继承”关系。毕竟引导类加载器是使用C++语言编写而成的,Java类编写的类加载器想去继承也无法继承。

  • 图中所表达的关系,仅仅是类的委托加载机制,尤其是著名的“双亲委派”。虽然几种加载器之间没有继承关系,但是扩展类加载器及用户自定义加载器,却都继承自java.lang.ClassLoader这个基类。
  • 图中所表达的委托关系,本质上通过java.lang.ClassLoader.parent字段实现,该字段表示父加载器。对于引导类加载器,并没有所谓的父加载器的概念,因为引导类加载器本身是随JVM的启动而初始化,并且该类中的字段和方法全部是静态字段和方法,并不需要实例化便能使用。而除了引导类加载器之外的所有类加载器,由于都继承自java.lang.ClassLoader这个基类,因此便都有parent字段,由于该字段被final private 修饰,因此子类只能通过调用java.lang.ClassLoader的构造函数才能初始化该字段。对于扩展类加载器和系统类加载器,在JVM第一次加载Java类时会被创建,并完成其父类加载器的设定。扩展类加载器与系统类加载器在sun.misc.Launcher类的构造函数中完成初始化,sun.misc.Launcher类的构造函数逻辑如下:
  • public class Launcher {
        private static URLStreamHandlerFactory factory =new Factoru();
        private static Launcher launcher = new Launcher();//启动器
        private static String bootClassPath = System.getProperty("sun.boot.class.path");//引导类加载器路径
        private ClassLoader loader;//系统类加载器
        
        public Launcher() {
            ClassLoader extc1;
            //创建扩展类加载器
            extc1 = sun.misc.Launcher.ExtClassLoader.getExtClassLoader();
            //创建系统类加载器
            loader = sun.misc.Launcher.AppClassLoader.getAppClassLoader(extc1);
        }
    }
    在Launcher类的构造函数中,首先创建了扩展类加载器,接着创建了系统类加载器。注意,扩展类加载器是在构造函数中定了的局部变量ext1,而系统类加载器则是Launcher类的成员变量loader。但是当Launcher类的构造函数执行完之后,扩展类加载器实例对象并不会被GC回收,因为在创建系统类加载器的时候,扩展类加载器被设置为系统加载器的parent,因此当JVM想加载扩展类时,总是能够通过系统类加载器的parent属性获取到扩展类加载器,从而使用扩展类加载器去加载响应的类库。
  • @未完待续。。。。。。
Java 类加载机制分析 / 传入 .class 文件的绝对路径,加载 Class// 重写了 findClass 方法@Overrideif (!= -1) { 阅读详情

相关推荐

从零开始:使用COLMAP与OpenMVS构建高精度三维Mesh模型

本文为零基础新手提供了使用COLMAP与OpenMVS构建高精度三维Mesh模型的完整实战指南。详细介绍了从环境配置、数据采集黄金法则,到COLMAP稀疏与稠密重建、OpenMVS网格生成与纹理映射的每一步操作,并分享了关键的避坑技巧与参数调优建议,帮助读者从二维照片中成功重建出属于自己的三维模型。

metal的博客 504

深入理解Java中的类加载机制

类加载机制是Java虚拟机(JVM)中的核心部分,它决定了类的生命周期以及如何将类的字节码加载到内存中。这种模型的核心原则是:一个类加载器在加载类时,会将请求委派给父类加载器,直到启动类加载器。类加载器的层次结构和双亲委派模型使得Java能够实现热部署,即在不重启应用程序的情况下,动态加载或卸载类。类的类加载器以及其父类加载器的信息。通常情况下,应用程序类加载器的父类加载器是扩展类加载器,扩展类加载器的父类加载器是启动类加载器。例如,应用程序类加载器只能加载用户自定义的类,不能加载JDK核心类。

技术研究中心 1183

基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型对话聊天机器人

前面两篇博文,我们在笔记本部署了Llama 3 8B大模型,使用Ollama搭建了基于Web 可视化对话机器人。在使用过程中,大模型经常出现中文问题英文回答的问题。本博文就用Llama3-Chinese-Chat微调模型来解决这个问题……

老牛啊 9238

JVM类加载机制深度剖析

1、类加载过程 多个java文件经过编译打包生成可运行jar包,最终由java命令运行某个主类的main函数启动程序,这里首先需要通过类加载器把主类加载到JVM。 主类在运行过程中如果使用到其它类,会逐步加载这些类。 注意,jar包里的类不是一次性全部加载的,是使用到时才加载。 类加载到使用整个过程有如下几步: 加载 >> 验证 >> 准备 >> 解析 >...

我的java进阶之路 245

不止于算力:深入鲲鹏920的片上网络(NoC)与一致性协议HCCS,看华为如何优化数据流转

本文深入解析了鲲鹏920处理器的片上网络(NoC)架构和一致性协议HCCS,揭示了华为如何通过创新的环总线设计和私有协议优化数据流转效率。文章详细介绍了鲲鹏920在多die、多芯片环境下的高效协同机制,包括环总线架构、HCCS协议精妙设计及物理实现创新,为云服务场景提供了高性能解决方案。

weixin_30681121的博客 251

【YOLOv11改进- 主干网络】YOLOv11+WTConv(ECCV2024): 基于YOLOv11的主干网络改进,大感受野的小波卷积

论文提出了WTConv,这是一个使用级联小波分解的层,并执行一组小卷积核的卷积,每个卷积专注于输入的不同频率带,并具有越来越大的感受野。这个过程能够在输入中对低频信息给予更多重视,同时仅增加少量可训练参数。实际上,对于一个  的感受野,可训练参数数量只随着  的增长而呈对数增长。而WTConv与常规方法的参数平方增长形成对比,能够获得有效的卷积神经网络(CNN),其有效感受野(ERF)大小前所未有。

qq_41304809的博客 1401

1、jdk源码分析类加载机制,tomcat双亲委派

Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK, 就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等 Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码----> 程序运行。 类加载运行全过程 当.

u011107814的专栏 416

华为OD机试真题2026双机位C卷 Python&JS 语言 实现【主次关联成环警告】

在ICT运维领域,现网运维工程师面向对设备上报的众多告警,往往需要筛选出最主要的告警优先处理,次等级的告警或许为同一个根因导致的告警,处理优先级会放后或者不处理,这样就诞生出主次关联告警的概念。给定一系列告警的主次关联关系,判断是否存在如下情况:

MISAYAONE的博客 269

深入详解JVM之类加载器深度剖析

文章目录类加载器深入剖析ClassLoader(类加载器)类的加载、连接与初始化 类加载器深入剖析 ClassLoader(类加载器) Java虚拟机与程序的生命周期在如下几种情况下, Java虚拟机将结束生命周期 - 执行了System.exit()方法 - 程序正常执行结束 - 程序在执行过程中遇到了异常或错误而异常终止 - 由于操作系统出现错误而导致Java虚拟机进程 类的加载、连接与...

张议的博客 1401

快速入门必看!RT-DETR手把手训练自己的数据集去跑实验,基于 ultralytics 仓库源码改进,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。

本文介绍了使用Ultralytics框架训练RT-DETR模型的全流程。首先需要创建Python 3.10虚拟环境,安装指定版本的PyTorch和相关依赖包。然后准备数据集,修改配置文件,并详细介绍训练、验证和推理三个核心步骤的代码实现。训练阶段使用RTDETR类加载模型配置,设置训练参数;验证阶段评估模型性能;推理阶段可对图片、视频等进行预测。文中还提供了清华大学镜像源加速下载,以及详细的参数配置说明,帮助用户快速搭建RT-DETR目标检测模型。

Ai缝合怪、助力小伙伴高效发论文 5540

【ROS2】手眼标定:moveit2_handeye_calib使用详解

moveit2_handeye_calib MoveIt2 官方的 手眼标定功能包,包含标定插件、图形化界面和示例程序。提供基于 ArUco/ChArUco 标定板的采集与求解功能。标定板下载aruco在线生成器。

郭老二 246

java程序启动时cpu和负载高探索

这两天协助运维定位1个监控程序CPU占用率达到150%的问题,过程曲折,结论简单,很有意思:) 首先我们来看一下cpu高时候截图: 可以看到红色框中的监控程序CPU占用率都很高,但其实这些监控程序的实现很简单:发送1个http请求,收到响应后简单判断一下响应码,然后打印监控结果,打印完成就退出了。每次监控都会重新由daemon程序拉起运行。 这么简单...

weixin_34372728的博客 404

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

如何解决 Jacob 与 Tomcat 类加载问题:深入分析 Tomcat 类加载机制与 JVM 双亲委派机制

本文分析了在Java Web项目中集成Jacob库时常见的ClassNotFoundException和UnsatisfiedLinkError问题。通过解析Tomcat的类加载机制和JVM双亲委派模型,指出问题根源在于Tomcat的child-first策略导致WebAppClassLoader无法正确加载共享库。解决方案包括:1)将jacob.jar和jacob.dll放入Tomcat/lib目录由CommonClassLoader统一加载;2)在context.xml中配置delegate=&quot

Knight 1004

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java类加载与JVM详解:从基础到双亲委托机制

本文深入解析Java虚拟机的核心机制。首先阐明JDK、JRE和JVM的层级关系,详细剖析JVM内存结构,包括方法区、堆、栈等核心区域。重点讲解类加载机制,涵盖加载时机、流程和双亲委托模型原理,通过自定义String类案例演示安全机制。最后介绍类加载器的常用方法,如资源文件加载等。理解这些底层机制对优化性能、排查问题及掌握高级特性具有重要意义。

m0_73073987的博客 1392

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JVM类加载机制

我这里有个Math类,代码如下: 该类运行main方法,到方法结束,jvm是底层是如下图所示执行的: 其中jvm加载类的过程会经历以下几个步骤: 类被加载到方法区之后主要包含运行时常量池、类型信息、字段信息、方法信息、类加载的引用、对应class实例的引用等信息。 上述代码中调用了A,但是没调用B,所以只会加载Class A 而不会加载Class B 上述代码中调用了A,调用了B,所以逐步加载Class A和Class B上述类加载过程,主要是通过类加载器实现的,类加载器有以下几种类型:以下代码是对加载器

m0_68472894的博客 1024

从源码透彻理解JVM类加载机制

接下来,我们就逐个介绍一下几种类加载器。第一种:启动类加载器启动类加载器(引导类加载器,Bootstrap ClassLoader)这个类加载使用C/C++语言实现的,嵌套在JVM内部它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar、resources.jar或sun.boot.class.path路径下的内容),用于提供JVM自身需要的类万物之祖,不继承其他类,没有父加载器加载扩展类和应用程序类加载器,并作为他们的父类加载器。

纵横千里 捭阖四方 的专栏 870

JVM--面试题5:说说JVM的类加载机制和双亲委派模型

类加载请求先委托给父加载器,父加载器无法加载时,子加载器才尝试加载。│ 双亲委派模型工作流程 ││ ││ 类加载请求 ││ │ ││ ▼ ││ │ Custom Loader │ ──→ 先委托父加载器 ││ │ (自定义加载器) │ ││ │ ││ ▼ 委托 ││ │ App Loader │ ──→ 先委托父加载器 ││ │ (应用加载器) │ ││ │ ││ ▼ 委托 ││ │ Ext Loader │ ──→ 先委托父加载器 ││ │ (扩展加载器) │ ││ │ │。

weisian的博客 1万+

面试题:请介绍 JVM 类加载机制

JVM 类加载机制Java 代码执行流程类的生命周期加载验证准备解析初始化clinit 和 init 方法类加载的时机被动引用类加载器双亲委派机制 我们在前面分析JVM架构解析的时候,简单介绍了 Java 类加载机制,本文带大家深入分析一下。 Java 代码执行流程 根据上图所示,Java 代码执行步骤如下: 步骤 1: 获取 Java 源代码; 步骤 2: 编译器把 java 文件转变成 class 文件。编译过程大致可以分为 1 个准备过程和 3 个处理过程: 准备过程:初始化插入式注解处理器 解

xujunson的博客 3272

JVM关键总结(一)——类加载机制

文章目录一、类加载流程二、 类的生命周期及各阶段工作三、类加载阶段四、疑难 一、类加载流程 类加载分为加载、连接和初始化三个阶段,每个阶段对应了不同的任务。 二、 类的生命周期及各阶段工作 生命周期 加载——验证——准备——解析——初始化——使用——卸载 其中验证、准备及解析为类加载流程中连接阶段工作。 各阶段工作 加载:类加载器使用全限定名将.class文件加载入内存,可以通过本地磁盘...

简简单单记录 252

jvm类加载

摘要:   我们知道,一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述了类的各种信息,并且它们最终都需要被加载到虚拟机中才能被运行和使用。事实上,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始...

永恒日落 199

JVM类加载过程,超详细文章

Java类加载机制包括加载、连接(验证、准备、解析)、初始化等阶段。类初始化会在特定条件下触发,如使用new创建对象、访问静态字段/方法、反射调用等。加载阶段通过类名获取二进制字节流并生成Class对象。连接阶段包含验证字节码、为静态变量分配内存(准备阶段设置初始值)、将符号引用转为直接引用(解析)。初始化阶段真正执行Java代码,是第一个由程序主导的步骤。类加载过程确保了类型安全性和访问控制,在不同阶段处理类、字段、方法和接口的解析与验证。

m0_60167397的博客 960

深入分析ClassLoader工作机制

深入分析ClassLoader工作机制 结合资料,自己的一些理解,分析JVM的类加载器工作机制。 1.java类的加载机制 1.1 .什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装...

BestQiang的博客 1万+

《性能调优之JVM》❤️01深入了解JVM类加载机制

《性能调优之JVM》❤️01深入了解JVM类加载机制一、类加载运行全过程二、类加载器三、双亲委派机制四、为什么要设计双亲委派机制?五、怎么打破双亲委派机制?六、Tomcat打破双亲委派机制类加载器初始化过程 ❤️作者主页:温文尔雅的清欢渡 ❤️ 近期学习方向:性能调优 ❤️欢迎 点赞 ???? 收藏 ⭐ 留言 ???? 关注 ✌ 私聊我 一、类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到 JVM。 其中loadClass的类加载过程有如下几步: 加

weixin_46460843的博客 382

为什么90%的Java程序员都忽略了类加载机制?( JVM底层揭秘 )

掌握类加载机制,提升Java程序性能与灵活性。在java程序员节技术大会上,专家深入剖析JVM底层原理,揭示90%开发者忽略的关键细节,涵盖双亲委派、热部署等应用场景。理解这些核心机制,让系统更稳定高效,值得收藏。

BreakNexus的博客 572
上一篇: SpringCloud(Finchley.RELEASE版本)+SpringBoot(2.0.3.RELEASE)微服务框架搭建
下一篇: SpringCloud注册中心Eureka源码分析(一)
烫手的砖
博客等级 码龄8年 7粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值