JVM进阶之路(六)垃圾收集理论和算法

垃圾收集器G1&ZGC详解 文章目录前言一、G1垃圾收集器二、ZGC收集器(-XX:+UseZGC)总结 前言 这篇文件将为大家分析JVM中两种重要的垃圾收集器:G1和ZGC。目前看来,这两种垃圾收集器将会被广泛的使用,因此学习好它们的底层原理可以帮助我们更好的掌握如何进行JVM调优。现在很多公司开始从JDK1.8向JDK11进行迁移,很大一部分原因就是JDK11的默认垃圾收集器是G1.完全取代了CMS。后面我相信ZGC也会取代G1。 一、G1垃圾收集器 G1(Garbage-First)是一款面向服务器的垃圾收集器,***主要针对大 阅读详情

在前面我们了解了虚拟机如何判断对象可回收,接下来我们了解Java虚拟机垃圾收集的一些理论和算法。

1、分代收集理论

分代收集理论,是基于程序运行对象存活数量和对象年龄之间关系的一套经验法则。

存活对象数量与年龄的关系

它建立在两个分代假说之上:

  • 弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。
  • 强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消亡。

用通俗的话总结:大部分污渍很容易擦干净,多次擦都没擦干净的无责越来越难擦干净。

基于这个理论,收集器将Java堆划分出不同的区域,然后将回收对象按照年龄分配到不同的区域存储。

具体来讲,就是把Java堆划分为新生代 (Young Generation)和老年代(Old Generation)两个区域,新生代存放存活时间短的对象,而每次回收后存活的少量对象,将会逐步晋升到老年代中存放。

Java堆内存划分

对于新生代的对象,可以只关注如何保留少量存活而不是去标记那些大量将要被回收的对象;

对于老年代,可以降低垃圾收集频率,同时更加关注那些要消亡的对象。

为了降低垃圾回收的代价,在新生代和老年代采用了不同的垃圾收集算法。

基于分代,产生了一些垃圾收集的类型划分:

  • 部分收集(Partial GC):指目标不是完整收集整个Java堆的垃圾收集,其中又分为:

    • 新生代收集(Minor GC/Young GC):指目标只是新生代的垃圾收集。
    • 老年代收集(Major GC/Old GC):指目标只是老年代的垃圾收集。目前只有CMS收集器会有单独收集老年代的行为。
    • 混合收集(Mixed GC):指目标是收集整个新生代以及部分老年代的垃圾收集。目前只有G1收集器会有这种行为。
  • 整堆收集(Full GC):收集整个Java堆和方法区的垃圾收集。

2、垃圾收集算法

2.1、标记-清除算法

见名知义,标记-清除(Mark-Sweep)算法分为两个阶段:

  • 标记 : 标记出所有需要回收的对象
  • 清除:回收所有被标记的对象

标记-清除算法

标记-清除算法比较基础,但是主要存在两个缺点:

  • 执行效率不稳定,如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低。
  • 内存空间的碎片化问题,标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

标记-清除算法主要用于老年代,因为老年代可回收的对象比较少。

2.2、标记-复制算法

标记-复制算法解决了标记-清除算法面对大量可回收对象时执行效率低的问题。

过程也比较简单:将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

标记-复制算法

这种算法存在一个明显的缺点:一部分空间没有使用,存在空间的浪费。

新生代垃圾收集主要采用这种算法,因为新生代的存活对象比较少,每次复制的只是少量的存活对象。

一般虚拟机的具体实现不会采用1:1的比例划分,以HotSpot为例,HotSpot虚拟机将内存分为一块较大的Eden空间和两块较小的 Survivor空间,每次分配内存只使用Eden和其中一块Survivor。发生垃圾搜集时,将Eden和Survivor中仍然存活的对象一次性复制到另外一块Survivor空间上,然后直接清理掉Eden和已用过的那块Survivor空间。默认Eden和Survivor的大小比例是8∶1。

新生代内存划分

2.3、标记-整理算法

为了降低内存的消耗,引入一种针对性的算法:标记-整理(Mark-Compact)算法。

其中的标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。

标记-整理算法

标记-整理算法主要用于老年代,在老年代这种大量对象存活的区域,移动对象是个很大的负担,而且这种对象移动操作必须全程暂停用户应用程序(Stop The World)才能进行。

告别玄学调参:手把手教你用20元件模型搞定GaN HEMT高频仿真(附S参数提取避坑指南) 本文详细介绍了如何使用20元件模型优化GaN HEMT高频仿真,解决传统16元件模型在10GHz以上频段的误差问题。通过S参数提取避坑指南和实战案例,帮助工程师精准建模分布式电极效应和寄生反馈路径,提升射频电路设计效率。 阅读详情

相关推荐

别再只用线性回归了!用sklearn的核岭回归搞定非线性数据(附RBF核调参实战)

本文详细介绍了如何使用sklearn的核岭回归处理非线性数据,特别是RBF核的应用与调参实战。通过网格搜索找到最佳参数组合,核岭回归能有效捕捉数据中的复杂波动,显著提升模型性能。适合需要解决非线性问题的数据科学家和机器学习工程师。

weixin_34246529的博客 336

JVM垃圾回收——ZGC垃圾收集器

ZGC(Z Garbage Collector)是一款在jdk11中加入的具有实验性质的低延迟的垃圾收集器,在jdk15中去掉实验的标识,成为具有商用的垃圾收集器。垃圾收集停顿时间控制在10毫秒以内(在jdk16之后停顿时间已经控制到1毫秒以内)的一款低停顿的垃圾收集器。如果非要给ZGC下一个定义的话,ZGC收集器是一款基于Region内存布局的,不设分代(不分老年代、新生代)的,使用了等技术来实现的基于标记-整理算法实现的,以低延迟为首要目标的一款的垃圾收集器。

weixin_39555954的博客 5141

数字孪生成熟度的L0-L4五级划分,各自特征和应用场景

数字孪生的分级(或成熟度模型)通常用于描述其技术复杂度和功能完备性的演进过程。3D设计模型(CAD)、建筑信息模型(BIM)、产品数字化手册。全自动驾驶系统、自适应智能电网、 “黑灯工厂”的自主调度。多学科模型融合、 “What-if”分析、提供决策建议。IoT设备监控平台、预测性维护(报警)、智慧仪表盘。工艺仿真优化、资产性能管理、手术方案预演、虚拟调试。状态监控、历史回溯、阈值报警、根因分析。可视化、数字化档案。自优化、自适应、目标驱动、高度自治。传统设备、纸质记录的管理模式。无或仅有离线、孤立数据。

2401_82881178的博客 1546

Jvm之ZGC垃圾收集器

ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的实验性质的垃圾收集器。对于Java项目而言,JVM进行垃圾回收总是绕不开一个问题,那就是Stop The World。对于很多大型项目或对响应时间有要求的项目,垃圾回收的停顿时间就是一个痛点,而ZGC就是一款低延迟的垃圾收集器。

meser88的博客 784

Xilinx PCIe IP核示例工程仿真流程与关键任务解析

本文详细解析了Xilinx PCIe IP核示例工程的仿真流程与关键任务。通过搭建仿真环境、解读初始化日志,并深入剖析TSK_TX_MEMORY_WRITE_32等核心任务的TLP报文生成与交互过程,帮助开发者掌握PCIe IP核的仿真调试方法,为实际硬件设计提供可靠的验证基础。

weixin_28314575的博客 503

2026华为OD机试(C++)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,C++实现。

MISAYAONE的博客 20万+

详解ZGC垃圾收集器

从G1垃圾收集器开始,后面的垃圾收集器都不再将堆按照新生代和老年代作为整体进行回收,都采用了局部收集的设计思想。 可能是由于G1作为第一代局部收集的垃圾收集器,所以它继续保留了新生代和老年代的概念,笔者认为从局部收集和分区的内存布局来看,按代收集理论已经没有什么特别存在的必要了。 一、ZGC的设计思路 1.1 ZGC的内存布局 新一代的垃圾收集器ZGC(Z Garbage Collector)就完全抛弃了按代收集理论,它与G1一样将内存划分成各个小的区域的,但与G1有所不同的是,ZGC的各个内存区域称为页面

sermonlizhi的博客 5663

物理AI重构自动驾驶供应链 | 传统Tier1盈利模式崩塌,纯算法/软硬一体双路线落地对比,助力智驾软件商业化与全场景模型迭代

2026年是自动驾驶物理AI规模化落地元年,行业彻底告别传统感知-预测-规划-控制的模块化分层开发范式,迈入以世界模型、物理规则推演、端到端动作生成为核心的全新技术阶段。不同于传统AI仅完成图像识别、目标检测的浅层感知任务,物理AI能够深度理解道路交通中的动力学约束、路面摩擦、车辆博弈、行人运动规律等真实物理逻辑,实现对复杂路况的时序推演与自主决策,从底层重构自动驾驶技术架构。技术迭代同步引发产业链颠覆性变革,沿用数十年的传统自动驾驶Tier1商业模式全面崩塌。

getusushu的博客 285

JVM-ZGC垃圾收集器

ZGC(Z Garbage Collector)收集器是一款基于Region内存布局的,(暂时) 不设分代的,使用了等技术来实现的,以为首要目标的一款垃圾收集器。我们要知道的是是为了解决在并发-整理过程中 对象移动、引用更新这些问题的解决方案;

BASK2311的博客 1560

YOLOv11改进策略【损失函数篇】| WIoU v3:针对低质量样本的边界框回归损失函数

是一种基于IoU的损失函数,旨在解决目标检测中边界框回归损失函数在处理低质量训练数据时的问题。论文链接:https://arxiv.org/pdf/2301.10051 源码链接:https://github.com/Instinct323/wiou此处需要查看的文件是中定义了模型的损失函数和计算方法,我们想要加入新的损失函数就只需要将代码放到这个文件内即可将下方的函数替换原本的函数即可: 用于计算各种损失。在内修改如下代码,使模型调用此损失函数。 tal.py中是一些损失函数的功能应用。在内修改如下代码,

Limiiiing的博客 3790

20-CUDA规约算法:并行求和优化策略-✨

本文介绍了GPU上高效并行规约(Reduction)算法的优化技巧。规约是将大量数据合并为单个值的基础计算模式,广泛应用于科学计算等领域。文章从基础并行规约实现出发,逐步讲解了三种关键优化策略:1)交错寻址减少共享内存bank冲突;2)循环展开降低分支预测开销;3)多级规约处理大规模数据。性能对比显示,优化策略可带来最高4.5倍的加速效果。最后总结了最佳实践,包括合理使用共享内存、循环展开和warp级优化等技巧。这些优化方法可显著提升GPU计算密集型应用的性能。

2301_79143213的博客 171

【JVM进阶之路】六:垃圾收集理论和算法

JVM进阶之路第六篇,介绍分代收集理论和主要垃圾收集算法。

三分恶的博客 2558

注意力机制篇 | YOLOv8改进之在C2f模块添加EMA注意力机制(附2种改进方法)

EMA(Exponential Moving Average)注意力机制是一种用于增强模型性能的注意力机制,它通过对模型的特征图进行加权平均来提取更有用的特征信息。具体来说,EMA注意力机制通过引入一个权重因子来调整特征图中每个位置的重要性,从而使模型能够更好地关注重要的特征。🌈

小哥谈 4178

Java中的常见JVM垃圾收集算法

介绍几种常见的垃圾收集算法,比如复制算法、标记清除算法、标记压缩算法、综合其他算法的分代算法、G1的分区算法等。

终生学习践行者 3768

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

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JVM垃圾收集之——垃圾收集算法

链接: JVM垃圾收集之——怎样判定一个对象是不是垃圾 接上篇,介绍完怎样判定一个对象是不是垃圾之后,就该瞅一瞅垃圾是怎样回收的了 首先我们要知晓,垃圾收集是建立在两个分代假说之上的:收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄分配到不同的区域中存活。给出收集的几个名词,以便于大家看文章:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,也可以反过来标记存活的对象,然后回收违背标记的对象。第一步、找到内存中需要被回收的对象,并且把它们标记出来。第二步、清除掉被标记需要

想着百万年薪努力的小赵 5万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JVM垃圾收集算法及垃圾收集器

今天来总结一下最近学习到的JVM垃圾收集算法和垃圾收集器。原来以为这部分知识,对于一个Java程序员的用处不大,可是如果你的运营Web项目,出现了性能问题,那么这部分知识可以帮助你从运维的角度来优化你的项目。       首先,先讲一下JVM的垃圾收集算法,因为这是学习垃圾收集器的前堤。各种垃圾收集器也都是基于这些算法来实现的。 JVM垃圾收集算法       JVM垃圾收集算法有四种:

hello 5527

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JVM 垃圾收集器

E代表Eden区,S代表 Survivor 区,H代表的是 Humongous(G1 用来分配大对象的区域,对于 Humongous 也分配不下的超大对象,会分配在连续的 N个Humongous 中),剩余的深蓝色代表的是0ld区,灰色的代表的是空闲的 region这种思想上的转变和设计,使得G1可以面向堆内存任何部分来组成回收集来进行回收,衡量标准不再是它属于哪个分代,而是哪块内存存放的垃圾最多,回收收益最大,这就是G1收集器的 Mixed GC模式,即混合GC模式。这样实现简单,运行高效。

m0_68041576的博客 1853

JVM - 再聊GC垃圾收集算法及垃圾收集器

文章目录Pre分代收集理论常见的垃圾收集算法标记 Pre JVM-04垃圾收集Garbage Collection(上)【垃圾对象的判定】 JVM-05垃圾收集Garbage Collection(中)【垃圾收集算法】 JVM-06垃圾收集Garbage Collection(下)【垃圾收集器】 分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法 , 意思就是根据对象存活周期的不同将 java堆分为新生代和老年代,这样就可以根据各个年代的特点选择合适的垃圾收集算法。 举个例子,新生代中,大部分对象都是

小工匠 2万+

JVM垃圾收集算法和垃圾收集器

本文系统介绍了JVM垃圾收集算法和主流垃圾收集器。分代收集是商用虚拟机的核心策略,新生代多采用复制算法(如Serial、ParNew),老年代则使用标记-整理(Serial Old)或标记-清除(CMS)。重点分析了7种收集器特性:单线程的Serial/Serial Old适合客户端场景;多线程的ParNew是CMS默认搭档;Parallel Scavenge/Old组合专注吞吐量优化;CMS则以最短停顿时间为目标。不同算法和收集器的组合适应各类应用场景,需根据内存特点、CPU资源和对停顿时间的敏感度进行合

weixin_44963129的博客 1127

JVM的垃圾收集算法及垃圾收集器

本文介绍了JVM垃圾收集算法与收集器。分代收集理论将堆区划分为不同区域(新生代/老年代),针对各区域特点采用不同算法:新生代使用标记-复制算法,老年代采用标记-清除或标记-整理算法。重点分析了两种主流收集器:CMS收集器通过并发标记/清除实现低停顿,但会产生内存碎片;G1收集器采用Region分区设计,支持可预测停顿和空间整合,能同时管理新生代和老年代。

W18263823008的博客 1043

jvm 垃圾收集算法 详解

这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则:收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。Java堆划分为新生代(Young Generation)和老年代(Old Generation)两个区域。在新生代中,每次垃圾收集时都发现有大批对象死去,而每次回收后存活的少量对象, 将会逐步晋升到老年代中存放。

2402_82958989的博客 1366

JVM垃圾收集——垃圾收集器

垃圾收集器的发展和分类、Serial收集器、ParNew收集器、Parallel Scaveng收集器、CMS收集器、G1收集器、ZGC收集器

码说芯语的博客 2901

JVM—垃圾收集算法和HotSpot算法实现细节

分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期放在不同代上,不同代采用最适合它的垃圾回收方法进行回收。

摸鱼小小虫的博客 2401

JVM垃圾收集算法、对应收集器和选择建议

如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。

855

JVM中垃圾收集算法总结

  通过前面的介绍我们了解了对象创建和销毁的过程。那么JVM中垃圾收集器具体对对象回收采用的是什么算法呢?本文主要记录下JVM中垃圾收集的几种算法。 JVM的垃圾回收的算法 标记-清除算法(Mark-Sweep)   标记清除算法是最基础的回收算法,该算法分为两个阶段,即标记阶段和清除阶段。 阶段 说明 标记阶段 先根据可达性分析算法找出需要回收的对象进行标记 清除阶段 统一回...

波波烤鸭的博客 2773

JVM 垃圾收集算法全面解析

本文详细介绍了Java 8版本中的垃圾收集机制,重点分析了分代收集理论及其对垃圾回收效率的影响。文章深入探讨了三种主要的垃圾收集算法:标记-清除、标记-复制和标记-整理算法,并结合实际的Java 8垃圾收集器(Serial、Parallel、CMS、G1)进行讲解。每种算法的优缺点、适用场景以及在JVM中的实现方式都得到了详细阐述。此外,文中还提供了相关的JVM配置示例和代码,帮助读者更好地理解垃圾收集的原理及其调优策略。

持续输出Java相关知识 1062
上一篇: JVM进阶之路(五)垃圾回收概述和对象回收判定
下一篇: JVM进阶之路(七)垃圾收集器盘点
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值