JVM学习笔记02-类加载器子系统

深入理解Java类加载机制 Java的类加载机制是JVM实现的重要部分,了解类加载的过程、类加载器的工作原理以及双亲委派模型,有助于我们更好地编写和调试Java程序。希望本文的介绍和示例能够帮助你深入理解Java的类加载机制。如果有任何问题或进一步的讨论,欢迎随时交流。本文已收录于,我的技术网站,有大厂完整面经,工作技术,架构师成长之路,等经验分享。 阅读详情

目录

1、类加载器子系统的作用

2、类加载器ClassLoader角色

3、类的加载过程

3.1、加载

3.2、链接

4、类加载器的分类

4.1、引导类加载器(Bootstrap ClassLoader)

4.2、扩展类加载器(Extension Class Loader)

4.3、系统类加载器(System Class Loader)

4.4、用户类加载器(User Defined Class Loader)

5、双亲委派机制

6、其他


PDF版笔记:JVM的学习笔记PDF版-互联网文档类资源-优快云下载

1、类加载器子系统的作用

  • 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识
  • 类加载(ClassLoader)只负责class文件的加载,至于它是否可以运行,则由执行引擎(Execution Engine)决定
  • 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)

2、类加载器ClassLoader角色

  1. class file存在于本地硬盘上,可以理解为设计师画在纸上的模板,而最终这个模板在执行的时候是要加载到JVM当中来根据这个文件实例化出n个一模一样的实例。
  2. class file 加载到JVM中,被称为DNA元数据模板,放在方法区。
  3. 在class文件-> JVM ->最终成为元数据模板,此过程就要-个运输 工具(类装载器Class Loader) ,扮演一个快递员的角色。

3、类的加载过程

3.1、加载

  1. 通过一个类的全限定名获取定义此类的二进制字节流
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

补充:加载.calss文件的方式

  • 从本地系统中直接加载
  • 通过网络获取,典型场景:Web Applet
  • 从zip压缩包中读取,成为日后jar、war格式的基础
  • 运行时计算生成,使用最多的是:动态代理技术
  • 由其他文件生成,典型场景:JSP应用
  • 从专有数据库中提取.calss文件,比较少见
  • 从加密文件中获取,典型的防Class文件被反编译的保护措施

3.2、链接

  • 验证
    • 目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身的安全
    • 主要包括四种验证:文件格式验证(Java的是CAFEBABE)、元数据验证、字节码验证、符号引用验证
  • 准备
    • 为类变量分配内存并且设置该类变量的默认初始值,即零值
    • 这里不包括含用final修饰的static,因为final在编译的时候就会分配了,准备阶段会显示初始化
    • 这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中
  • 解析
    • 将常量池中的符号引用的过程
    • 事实上,解析操作往往会伴随着JVM在执行完初始化后再执行
    • 符号引用就是一组符号来描述所引用的目标。符号引用的字面量或一个间接定位到目标的句柄
    • 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。对应常量池的CONSTANT_Class_info、CONSTANT_Fielder_info、CONSTANT_Methodref_info等
  • 初始化
    • 初始化阶段就是执行类构造器方法()过程
    • 此方法不需要定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来
    • 构造器方法中指令按照语句在源文件中出现的顺序执行
    • ()不同于类的构造器(关联:构造器是虚拟机视角下的())
    • 若该类具有父类,JVM会保证子类的()执行前。父类的()已经执行完毕
    • 虚拟机必须保证一个类()方法在多线程下被同步加锁

4、类加载器的分类

  • JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类类加载器(User-Defined ClassLoader)
  • 这里的自定义类加载器指:所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器

程序中,我们最常见的类加载器

  1. 引导类加载器(Bootstrap ClassLoader) 非Java语言实现的
  2. 扩展类加载器(Extension Class Loader)
  3. 系统类加载器(System Class Loader)
  4. 用户类加载器(User Defined Class Loader)

4.1、引导类加载器(Bootstrap ClassLoader)

  • 这个类加载器使用C/C++语言实现的,嵌套在JVM内部
  • 用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar、resources.jar、sun.boot.class.path路径下的内容),用于提供JVM自身需要的类
  • 并不继承自java.lang.ClassLoader,没有父加载器
  • 加载扩张类和应用程序类加载器,并指定为它们的父类加载器
  • 出于安全考虑,引导启动类加载器只加载包名为java、javax、sun等开头的类

4.2、扩展类加载器(Extension Class Loader)

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

4.3、系统类加载器(System Class Loader)

  • Java语言编写
  • 派生于ClassLoader类
  • 父类加载器为扩展类加载器
  • 它负责加载环境变量classpath或系统属性java.class.path 指定路径下的类库
  • 该类加载器是程序中默认的类加载器,一般来说,Java应用的类都是有它来完成加载
  • 通过ClassLoader#getSystemClassLoader()方法可以获取到该类加载器

4.4、用户类加载器(User Defined Class Loader)

Q:为什么要自定义类加载器?

A:

  • 隔离加载类
  • 修改类加载的方式
  • 扩展加载源
  • 防止源码泄漏

Q:如何自定义类加载器?

A:

  1. 继承抽象类java.lang.ClassLoader
  2. JDK1.2前,需要在从写loadClass()方法,JDK1.2之后,建议把自定义的类加载逻辑写在findClass()方法中
  3. 如果没有太过复杂的需求,可以直接继承URLClassLoader类

5、双亲委派机制

工作原理:

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

优势:

  • 避免类的重复加载
  • 保护程序安全,防止核心的API被篡改

沙箱安全机制:通过双亲委派机制,保证对Java核心源代码的保护,这就是沙箱安全机制。

6、其他

目录

1、类加载器子系统的作用

2、类加载器ClassLoader角色

3、类的加载过程

3.1、加载

3.2、链接

4、类加载器的分类

4.1、引导类加载器(Bootstrap ClassLoader)

4.2、扩展类加载器(Extension Class Loader)

4.3、系统类加载器(System Class Loader)

4.4、用户类加载器(User Defined Class Loader)

5、双亲委派机制

6、其他


在JVM中,如何证明两个class对象是否为同一个类必须满足的两个条件:

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

对类加载器的引用:

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

Java程序对类的使用方式:

主动使用(7种):

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

被动使用:除了主动使用,其他使用Java类的方式被称为被动使用,都不会导致类的初始化

Java 类加载机制(超详细版) JVM 通过类的全限定名(比如找到对应的 .class 字节码文件,将其读入内存,并生成一个代表该类的对象(存储在方法区,是类的 “元数据载体”)。默认类加载器只能加载 “特定路径” 的类,若需要加载 “加密字节码”“网络字节码”“数据库存储的字节码”,则需要自定义类加载器。继承类(或,简化 URL 路径加载);重写方法(核心:实现字节码的读取和转化);调用方法(将字节数组转为Class对象,由父类提供,不可重写)。不要重写方法(默认实现双亲委派逻辑),若重写可能破坏双亲委派模型; 阅读详情

相关推荐

【JVM】java的jvm类加载器和类加载子系统

获取在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行折,在必要时,我们还可以自定义类加载器,来定制类的加载方式。那为什么还需要自定义类加载器呢?隔离加载类(比如现在的Spring框架和RocketMQ有包名路径完全一样的类,类名也一样,这个时候类就冲突了。所以允许用户自定义类的加载器。不过现在一般的主流框架和中间件都会自定义类加载器,实现不同的类加载,中间件之间是隔离的);扩展加载源(还可以考虑从数据库中加载类,路由器等不同的地方);防止源码泄漏。

No8g攻城狮的博客 891

一文搞懂Java类加载机制

初始化阶段是执行类构造器()方法的过程。

BarackYoung的博客 5431

2025反爬终极方案:Python破解Cloudflare v2行为指纹,设备伪装+轨迹模拟拦截率压至1%

Cloudflare v2的反爬逻辑越来越接近“人类行为识别”,单纯的技术破解已失效,核心竞争力变成“模拟真实用户的能力”。本文的终极方案本质是“全方位复刻人类行为”——从设备指纹到操作轨迹,从网络特征到交互模式,让爬虫成为“无法被区分的真实用户”。这套方案的优势是“通用性强”,不仅适用于Cloudflare v2,也能破解大多数高反爬网站(如小红书、知乎、跨境电商)的行为检测;且代码可直接复用,新手只需替换目标URL和数据提取逻辑,就能快速落地。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2355

Java类的加载机制

1、加载的生命周期类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Intialization)、使用(Using)、卸载(Unloding)7个阶段。其中验证、准备、解析 3个部分统称为链接(Linking)。加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之

u010257931的博客 3998

Lmbench测试集 --- 延迟测试工具lat_mem_rd

lmbench测试集简介 以及 lat_mem_rd延迟测试工具: 如何测试、测试结果、源码分析

MonologueYY的博客 1万+

Ai数字人直播系统源码部署

虚拟形象定制,直播内容智能生成,多语言支持,智能互动,声音克隆,24 小时不间断直播,多平台直播,智能数据分析,实时情感识别,视频合成,Ai数字人直播系统源码出售,Ai数字人直播系统源码部署实现 AI 数字人 24 小时不间断直播功能是一个较为复杂的任务,涉及到多个方面,如直播流的推送、内容的持续生成、系统的稳定性保障等。以下为你提供一个简化的实现思路和示例代码,借助 Python 结合 FFmpeg 工具来模拟 24 小时不间断直播。

weixin_ggwwsscc的博客 1257

Java 类加载机制

​ 本文深入地介绍了 Java 类加载机制,包含了 类生命周期、类加载器、双亲委派模型、自定义类加载器等相关知识点。

大大怪将军的博客 3517

三菱PLC软件GX-Works2使用和循环左移指令实现流水灯程序

(2)方式2:双击打开全局软元件注释,软元件名称手动输入,如M辅助继电器输入M0、D寄存器输入D0,然后找到对应的寄存器输入自定义的功能名字即可。链接:https://pan.baidu.com/s/14ZaBIq4mBirIqfd9Ja3AiA。链接:https://pan.baidu.com/s/1nuQz1OgS8bmagPE8T-PBkQ。链接:https://pan.baidu.com/s/1oKGi_bdLN5HI4HYxSXEdlA。(1)方式1:将定义好变量功能的CSV文件导入即可。

panjinliang066333的博客 1万+

JVM学习笔记---类加载器子系统

JVM学习笔记—什么是JVM

qq_39314972的博客 169

ArcGIS新手必看:5分钟搞定等高线转DEM栅格(附完整操作截图)

本文详细介绍了在ArcGIS中将等高线转换为DEM栅格的完整流程,包括CAD数据预处理、TIN转栅格和直接插值法两种核心方法,以及常见问题排查与优化技巧。通过实战案例和操作截图,帮助GIS新手快速掌握这一测绘数据处理的核心技能,提升地形分析和三维可视化效率。

dapp9builder的博客 287

K230+canMV开发中常见的数据类型转换参考示例

【代码】K230+canMV开发中常见的数据类型转换参考示例。

weixin_47446386的博客 68

JVM_02 类加载子系统

类加载器分类

1719

2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(五)(含2022年和2023年)

此部分包含华为机试真题,方向是数字芯片,内容详细包括设计、验证、后端等,大部分题目给出参考答案。华为机试都是从题库里抽题目,所以这些题目还是很有参考性的,甚至是完全一样,可以搜到的。(题目内容较多,将分开编写几个文章)

qq_42135020的博客 2083

【从零开始学JVM】第二章_类加载器子系统

类加载器子系统:属于JVM架构的一部分,类加载过程(加载、链接、初始化)、类加载器的分类(自带加载器,三种——启动类、扩展类、系统类加载器和自定义类加载器);双亲委派机制和沙箱安全机制

踢桃的成长之路 1802

手把手教你学Simulink--基于未来出行解决方案的场景实例:电动飞行汽车(eVTOL)的动力系统建模与仿真

电动垂直起降飞行器零道路拥堵:三维空间飞行绿色低碳:全电驱动,零排放快速响应:城市内15分钟直达低噪音:相比直升机↓20dB📊 预测:2030年全球eVTOL市场规模将超300亿美元,中国、美国、欧洲加速适航认证。本文通过,构建了电动飞行汽车(eVTOL)动力系统高压电池系统建模电力电子(DC-DC、逆变器)实现PMSM电机+螺旋桨推进系统搭建完整飞行任务动态仿真性能KPI评估与优化。

MHD0815的博客 443

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JVM:类加载子系统

JVM:类加载子系统

weixin_74019079的博客 1012

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JVM类加载器

文章目录一、类加载器二、类与类加载器三、双亲委派模型四、破坏双亲委派模型4.1、Tomcat4.1.1、WebApp类加载器4.1.2、Shared类加载器4.1.3、Catalina类加载器4.1.4、Common类加载器4.1.5、Jsp类加载器4.2、JDBC 一、类加载器 从Java虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都由Java语

rockvine的博客 3486

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JVM虚拟机,类加载器子系统

JVM虚拟机,类加载器子系统 一、类加载器子系统概念: 类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成java.lang.Class类的一个...

qq_43310151的博客 271

02 类加载器子系统

1. 内存结构概述 图2-1 JVM内存结构(中) 图2-2 JVM内存结构(英) 如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢? 类加载器 执行引擎 2. 类加载器与类的加载过程 2.1 类加载器子系统的作用 图2-3 类加载器子系统 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由执行引擎Execution Engine决定。 加载的类信息存放于一

rrq_0324的博客 672

JVM类加载器详解

前言 在上一篇中,通过下面这幅图大致了JVM整体的内部运行结构图,在JVM的结构中,类加载子系统作为连接外部class文件与真正将class文件加载到运行时数据区,承担着重要的作用 类加载器是什么?有什么作用? 1、负责从文件或者网络加载class文件字节流 2、读取字节码中的信息,并在运行时存储到JVM的内存区域 3、检查并确保加载的class文件信息符合JVM字节码规范 ...

congge 6356

JVM类加载器子系统

类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特点的文件标识 ClassLoader只负责class文件的加载,至于它是否可以运行,则有Execution Engine决定 加载的类信息存放于一块称为方法区的内存空间,除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量 类的加载过程 加载 通过一个类的全限定名获取此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成一个代

qq_43455790的博客 375

JVM —— 类加载器子系统

JVM —— 类加载器子系统

qq_52025570的博客 347

JVM 类加载器子系统

类加载器的描述与理解

qq_57533658的博客 796

《JVM系列》 第二章 -- 类加载器子系统

类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载**,至于它是否可以运行,则由Execution Engine决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)

龙源IT 的博客 665

JVM笔记:类加载子系统

类加载器子系统负责从文件系统或者网络中加载Class 文件, class 文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载, 至于它是否可以运行, 则由Execution Engine 决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外, 方法区中还会存放运行时常量池信息, 可能还包括字符串字面量和数字常量( 这部分常量信息是Class 文件中常量池部分的内存映射)对于用户自定义类来说:使用系统类加载器AppClassLoader进行加载。

20年码农 1152

JVM - 类加载器

JVM - 类加载器

目目沐沐 4万+
上一篇: JVM学习笔记01-JVM与其结构结构
下一篇: JVM学习笔记03-运行时数据区(上)
逆bug而行的小尘
博客等级 码龄6年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值