类加载的过程,双亲委派模型以及垃圾回收机制

news/2026/1/19 23:15:03/文章来源:https://www.cnblogs.com/xi-yongqi/p/19503961

类加载

  • Java的类加载过程是将.class文件中的二进制数据读入内存,并最终形成可被虚拟机直接使用的Java类型。这一过程主要分为 加载、连接(验证、准备、解析)、初始化三大阶段。

加载(Loading):

  • 这是类加载的第一步,由类加载器 (ClassLoader) 完成。
  1. 通过类的全限定名获取定义此类的二进制字节流(可以从磁盘、JAR 包、网络等获取)。
  2. 将这个字节流代表的静态存储结构转化为方法区的运行时数据结构。
  3. 在内存(堆)中生成一个代表该类的 java.lang.Class 对象,作为方法区这些数据的访问入口。

连接 (Linking):

  • 连接阶段负责将类合并到JVM的运行时状态中,分为三个子步骤:
  1. 验证 (Verification):确保字节流信息符合当前虚拟机的要求,不会危害虚拟机安全(如检查文件格式、元数据、字节码语义等)。
  2. 准备 (Preparation):为类的静态变量 (static) 分配内存,并设置默认初始值(如int 设为 0,引用类型设为 null)。
    注意:此时并未执行 Java 代码。如果是 final static 常量,则会在此阶段直接赋值。
  3. 解析 (Resolution):将常量池内的符号引用(如方法名、类名字符串)替换为直接引用(直接指向目标的指针或偏移量)。

初始化 (Initialization):

  • 这是类加载的最后一步,也是真正开始执行Java 字节码的阶段。初始化阶段就是执⾏类构造器⽅法的过程。
    • 核心逻辑:执行类构造器 () 方法。
    • 主要任务:1. 执行静态变量的显式赋值语句(如 static int i = 10;)。 2. 执行静态代码块 (static { ... })。
    • 触发时机:只有当类被“主动使用”时才会触发(如 new 实例化对象、访问静态字段、调用静态方法、反射等)。

双亲委派模型

什么是双亲委派模型?

  • 如果⼀个类加载器收到了类加载的请求,它⾸先不会⾃⼰去尝试加载这个类,⽽是把这个请求委派给⽗类加载器去完成,每⼀个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当⽗加载器反馈⾃⼰⽆法完成这个加载请求(它的搜索范围中没有找到所需的类)时,⼦加载器才会尝试⾃⼰去完成加载。
  1. 类加载器的等级制度
  • 站在Java虚拟机的⻆度来看,只存在两种不同的类加载器:⼀种是启动类加载器(BootstrapClassLoader),这个类加载器使⽤C++语⾔实现,是虚拟机⾃⾝的⼀部分;另外⼀种就是其他所有的类加载器,这些类加载器都由Java语⾔实现,独⽴存在于虚拟机外部,并且全都继承⾃抽象类java.lang.ClassLoader。
  1. 工作原理(三步走),当一个类加载器接收到加载请求时:
  • 向上委托:它先看自己有没有加载过这个类。如果没有,它不会自己去读字节码,而是调用父加载器的loadClass方法。这个过程一直递归到顶层的Bootstrap ClassLoader。
  • 顶层检查:顶层加载器尝试在自己的搜索范围(如核心类库)中寻找该类。
  • 向下接力:如果父加载器没找到,它会告诉子加载器:“我搞不定,你自己试吧”。这时子加载器才会调用自己的findClass 方法尝试加载。如果全链条都找不到,最终抛出ClassNotFoundException。

双亲委派模型的优点:

  1. 避免重复加载类:⽐如A类和B类都有⼀个⽗类C类,那么当A启动时就会将C类加载起来,那么在B类进⾏加载时就不需要在重复加载C类了。
  2. 安全性:使⽤双亲委派模型也可以保证了Java的核⼼API不被篡改,如果没有使⽤双亲委派模型,⽽是每个类加载器加载⾃⼰的话就会出现⼀些问题,⽐如我们编写⼀个称为java.lang.Object类的话,那么程序运⾏的时候,系统就会出现多个不同的Object类,⽽有些Object类⼜是用户⾃⼰提供的因此安全性就不能得到保证了。

模型的不足:

  • 虽然这个模型很棒,但在某些特殊场景下需要“逆向操作”:
  1. SPI (Service Provider Interface):比如 JDBC。核心类(由 Bootstrap 加载)需要调用第三方厂商实现的驱动代码(由 AppClassLoader 加载)。此时父加载器需要请求子加载器去加载类,这破坏了单向向上的委派。
  2. 热部署/热插拔:像OSGi或某些应用服务器(Tomcat),为了实现模块独立和动态更新,会自定义复杂的类加载机制。

垃圾回收机制

  • 在Java中,所有的对象都是要存在内存中的(也可以说内存中存储的是⼀个个对象),因此我们将内存回收,也可以叫做死亡对象的回收。

死亡对象的判断算法:

  • 可达性分析算法 (Reachability Analysis):Java并不使用“引用计数法”,因为它无法解决对象间循环引用的问题。Java使用的是可达性分析:从一系列被称为 GC Roots 的根对象开始向下搜索,如果一个对象到 GC Roots 没有任何引用链相连,则判定该对象为可回收。
  • 常作为 GC Roots 的对象包括:
    • 虚拟机栈中引用的对象(局部变量)。
    • 方法区中类静态属性、常量引用的对象。
    • 本地方法栈(Native Method)引用的对象。

回收算法

  1. 标记-清除 (Mark-Sweep):
  • 过程:标记出所有需要回收的对象,然后统一回收。
  • 问题:会产生大量不连续的内存碎片,导致大对象无法找到足够的连续空间。
  1. 标记-复制 (Copying):
  • 过程:将内存分为容量相等的两块,每次只使用一块。垃圾回收时,将存活对象复制到另一块,然后清空当前块。
  • 优点:效率高,无碎片。
  • 缺点:内存利用率低(只有 50%)。
  1. 标记-整理 (Mark-Compact):
  • 过程:标记后,让所有存活对象向内存一端移动,然后直接清理掉边界以外的内存。
  • 优点:避免了碎片,也无需浪费一半空间。
  1. 分代算法:
  • 当前JVM垃圾收集都采⽤的是"分代收集(Generational Collection)"算法,这个算法并没有新思想,只是根据对象存活周期的不同将内存划分为⼏块。⼀般是把Java堆分为新⽣代和⽼年代。在新⽣代中,每次垃圾回收都有⼤批对象死去,只有少量存活,因此我们采⽤复制算法;⽽⽼年代中对象存活率⾼、没有额外空间对它进⾏分配担保,就必须采⽤"标记-清理"或者"标记-整理"算法。
  • 新生代 (Young Generation):绝大多数创建的新对象都在这里诞生。
    • 结构:分为 Eden、Survivor From、Survivor To(比例通常是 8:1:1)。
    • 算法:采用复制算法。因为存活对象少,复制成本极低。
  • 老年代 (Old Generation):存放生命周期长的对象(比如大对象、经过多次 GC 依然存活的对象)。
    • 算法:采用标记-清除或标记-整理算法。
  1. 请问了解Minor GC和Full GC么,这两种GC有什么不⼀样吗
  • Minor GC⼜称为新⽣代GC:指的是发⽣在新⽣代的垃圾收集。因为Java对象⼤多都具备朝⽣夕灭的特性,因此MinorGC(采⽤复制算法)⾮常频繁,⼀般回收速度也⽐较快。
  • Full GC⼜称为⽼年代GC或者Major GC:指发⽣在⽼年代的垃圾收集。出现了Major GC,经常会伴随⾄少⼀次的Minor GC(并⾮绝对,在Parallel Scavenge收集器中就有直接进⾏Full GC的策略选择过程)。Major GC的速度⼀般会⽐Minor GC慢10倍以上。

垃圾回收器

  • 垃圾回收器是算法的具体实现。不同版本和场景下,选择也不同:
  1. CMS (Concurrent Mark Sweep):追求最短回收停顿时间。它在标记和清除时可以和用户线程并发执行,适合对响应速度有要求的互联网应用。
  2. G1 (Garbage First):JDK 9 以后的默认选择。它打破了物理隔离的新生代/老年代概念,将堆拆分为多个 Region。它会计算哪个区域回收收益最高,优先回收那块区域。
  3. ZGC:现代顶级回收器。通过“着色指针”和“读屏障”技术,无论堆内存有多大,停顿时间(STW)都能控制在 1ms 以内。

补充:什么是STW (Stop The World)?

  • 这是GC过程中的一个痛点。在执行某些回收逻辑时,必须暂停所有的用户线程,以确保在标记或移动对象时,内存状态是静止的。优化GC的核心目标,就是尽可能减少STW的时长和频率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1185586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习毕设项目推荐-基于python-CNN卷积神经网络机器学习的柑橘成熟度识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Shader中颜色的加法和乘法的区别

最近在抽空复习图形学,我一开始没注意到环境光、漫反射、镜面反射的处理方式是通过向量加法,即ambient + diffuse + specular 直到后来研究多光源时,才发现不同光源的最终光照值也是通过向量加法计算的。这时我才突…

谈谈我是如何面试技术人员的

1.面试的重点不是为难面试者,自己炫技 2.面试是把他当作你的同事,跟他探讨问题 3.尽量对他擅长的点进行深度挖掘 4.要引导面试者讲出他擅长的点和深度的点系统性的需要考察的知识点: 判断能力的大概打分系统: 我自…

自制py功能包解析IMU航迹推算

在 ROS Melodic 环境下,想要用 Python 实现读取/imu/data话题、完成惯性导航航迹推算(含静态初始化),并在 RViz 中实时可视化位姿轨迹一、环境依赖编译# 核心ROS依赖 sudo apt-get install ros-melodic-ros-python ros-melodic-se…

破解银发学习痛点 兴趣岛 “普惠 + 品质” 模式打造积极老龄化范本

你以为 60 的退休生活,就是围着孙子、灶台打转,或是在广场舞的旋律里消磨时光?有这样 50 多位平均年龄超 60 岁的乐龄歌者,用一场专业舞台的音乐会给出了不一样的答案。1 月 16 日晚,广州南越 SYNT 演艺中心温情涌动&…

flask基于python的在线课程学习平台

目录基于Flask的Python在线课程学习平台摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!基于Flask的Python在线课程学习平台摘要 Flask作为轻量级Python Web框架,以其灵活性…

肾脏超声图像质量评估与分类系统实现(附Mask R-CNN模型训练)_1

1. 肾脏超声图像质量评估与分类系统实现(附Mask R-CNN模型训练) 1.1. 摘要 本文详细介绍了一个基于深度学习的肾脏超声图像质量评估与分类系统的实现过程。系统采用Mask R-CNN作为核心模型,通过对肾脏超声图像进行质量评估和分类,…

2026人参粉选购指南:从“百草之王”到“品质之选”-神象18年林下山参粉 - 行业调研院

《神农本草经》将人参列为“上品”,称其“主补五脏,安精神,定魂魄,止惊悸,除邪气,明目,开心益智”。作为传承千年的“滋补圣品”,人参至今仍是国人调理身体的首选——但如今快节奏的生活里,没人有时间熬参汤、…

java学习笔记1.5

Day05 方法: 程序中的独立功能,也是最小的执行单元使用场景:经常使用的代码打包,放在方法中。好处:提高了程序的复用性和可维护性 核心:接受数据->计算结果->返回结果 int getSum (int a,int b){ //接…

flask基于Python的智能购物电商平台商城

目录摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 随着电子商务的快速发展,智能购物平台的需求日益增长。基于Python的Flask框架开发的智能购物电商平台,…

深度学习毕设选题推荐:基于python-CNN深度学习识别猫脸

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

java学习笔记1.6

Day06 java中的运行机制 1.java的程序运行的过程是怎么样的? .java文件->编译->.class字节码文件->运行(在虚拟机里运行) 2.java不是直接运行在操作系统里面的,是运行在虚拟机里面的 3.虚拟机的好处:利用虚拟…

编曲伴奏软件有哪些,音乐人分享AI编曲软件助力原创音乐创作

探索编曲伴奏软件新境界:AI编曲软件助力音乐创作 在音乐制作的广阔天地里,编曲伴奏软件一直是音乐人的得力助手。它们能让音乐人的创意从无形的灵感转化为具体可听的旋律。而如今,随着科技的飞速发展,AI编曲软件的出现更是为音乐制…

flask基于Python的膳食营养健康系统

目录基于Flask的膳食营养健康系统摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!基于Flask的膳食营养健康系统摘要 膳食营养健康系统基于Python的Flask框架开发,旨在为用户…

计算机深度学习毕设实战-基于python-CNN深度学习卷神经网络识别猫脸

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

如何高效发布新款,在线看款?

做服装批发的姐妹们,是不是每次上新、开选款会,都要把新款图片、细节图、面料图一股脑发给供应商,然后群里来去,图片发了一堆,对方还可能看不全、看不清,或者信息混乱?👏土著相册小&…

新手必看:渗透测试实战流程 + 工具全攻略(零门槛适配)

对网络安全新手而言,渗透测试看似门槛极高,实则核心是“按流程拆解、用工具辅助、靠实操落地”。它本质是模拟黑客合法攻击,排查系统漏洞、验证防护能力的过程,也是网络安全实战的核心技能。本文将拆解渗透测试全流程,…

flask基于Python的运维管理系统 交换机故障预警处理系统4y5n9i32

目录系统概述核心功能技术架构应用价值开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统概述 Flask基于Python的运维管理系统(交换机故障预警处理系统4y5n9i32)是…

深度学习毕设项目:基于python-CNN深度学习识别猫脸

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

深度学习毕设项目:基于python-CNN卷积神经网络的柑橘成熟度识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…