JVM优化之垃圾收集底层算法实现

JVM优化之垃圾收集底层算法实现

  • 三色标记
  • 多标-浮动垃圾
    • 多标
      • 多标过程
    • 浮动垃圾
      • 处理浮动垃圾
      • 总结
  • 漏标-读写屏障
    • 漏标
    • 读写屏障
      • 读屏障
      • 写屏障
      • 应用实例
      • 总结
  • 记忆集与卡表
    • 记忆集
      • 记忆集的作用
      • 记忆集的实现
    • 卡表
      • 卡表的作用
      • 卡表的实现
    • 应用实例
    • 总结

在并发标记过程中,用户线程并未终止,对象间的引用关系就有可能发生变化,多标和漏标的情况就有可能发生。

三色标记

详情见文章JVM优化之三色标记

多标-浮动垃圾

多标-浮动垃圾(Multi-phase Marking and Floating Garbage)是现代垃圾收集器中的概念,特别是在增量或并发垃圾收集器中会遇到。

多标

多标(Multi-phase Marking)是指垃圾收集器在多个阶段(或多个标记周期)中完成标记工作,而不是一次性完成整个堆的标记。这种方法的主要目的是减少垃圾收集过程中对应用程序的停顿时间。

多标过程

  1. 初始标记(Initial Mark):

这一阶段通常会引起短暂的停顿,垃圾收集器标记从根对象(GC Roots)直接引用的对象。

  1. 并发标记(Concurrent Mark):

在这一阶段,垃圾收集器与应用程序同时运行,继续标记所有可达的对象。

  1. 重新标记(Remark):

这一阶段也会引起短暂停顿,用于处理并发标记阶段期间应用程序的变动(即新创建或更新的引用)。

  1. 清除(Cleanup):

清除阶段回收不可达的对象。

浮动垃圾

浮动垃圾(Floating Garbage)指的是在并发垃圾收集过程中,由于应用程序继续运行并创建或修改对象引用,导致某些对象在当前垃圾收集周期中未被标记为可达,但实际上是可达的。这些对象不会在本次垃圾收集过程中被回收,而会在下一次垃圾收集中被正确处理。

具体来说,浮动垃圾的产生可以这样理解:

  • 开始垃圾收集

假设垃圾收集器开始了一个新的标记周期。

  • 并发执行

在并发标记阶段,应用程序继续运行并创建了新的对象或修改了引用。

  • 未被标记

新创建的对象或者更新的引用在当前标记周期内未被标记。

  • 被认为不可达

由于这些对象未被标记,它们被认为是不可达的,但实际上它们可能在应用程序中被引用。

处理浮动垃圾

  1. 并发标记:

尽量减少浮动垃圾的数量,但完全避免是不可能的。

  1. 多标策略

通过多次标记来确保尽可能多的对象被正确标记。

  1. 增量回收

分阶段进行回收,允许在应用程序运行时进行垃圾收集,减少停顿时间。

总结

多标-浮动垃圾是现代垃圾收集器在提高效率和减少停顿时间时必须应对的挑战。通过分阶段的标记和并发执行,垃圾收集器能够在不显著影响应用程序性能的情况下,尽量回收内存并管理浮动垃圾。

漏标-读写屏障

漏标(Missing Mark)和读写屏障(Read/Write Barrier)是现代垃圾收集器用来解决并发和增量垃圾收集过程中挑战的重要技术概念。

漏标

漏标(Missing Mark)是指在并发标记过程中,由于应用程序继续运行,某些对象或引用没有被正确标记为可达的情况。这会导致垃圾收集器错误地认为这些对象是垃圾,从而可能回收仍在使用的对象。这种情况尤其在并发或增量垃圾收集器中容易发生,因为垃圾收集和应用程序逻辑是同时进行的。

读写屏障

为了应对漏标问题,垃圾收集器引入了读写屏障(Read/Write Barrier)机制。这些屏障是插入到对象引用读写操作中的特殊代码,确保在并发标记过程中正确跟踪对象引用的变化。读写屏障帮助垃圾收集器维护对象图的准确性,防止漏标和浮动垃圾问题。

读屏障

读屏障(Read Barrier)是在对象引用发生读操作时执行的代码。读屏障的使用比写屏障少见,但在某些垃圾收集器中(如Shenandoah和ZGC)非常重要。

  1. 并发标记和压缩

读屏障可以帮助处理并发标记和压缩过程中对象的引用更新,确保对象在被访问时处于正确的状态。

  1. 转发指针(Forwarding Pointer)

在对象被移动时,读屏障可以检查并跟随转发指针,以访问对象的新位置。

写屏障

写屏障(Write Barrier)是在对象引用发生写操作时执行的代码。

它主要用于:

  1. 卡表(Card Table)维护

写屏障可以将包含新引用的内存区域标记为脏,以便垃圾收集器在下一次回收时检查这些区域。

  1. 记忆集(Remembered Set)更新

当一个引用被更新时,写屏障可以将该引用加入到记忆集中,以确保在增量或并发标记阶段不会漏掉这些引用。

  1. 跨代引用处理

在分代垃圾收集中,写屏障可以用于跟踪从老年代到新生代的引用,确保这些引用在垃圾回收过程中被正确处理。

应用实例

  • Java G1垃圾收集器

G1(Garbage-First)垃圾收集器使用写屏障来维护记忆集和卡表,以支持其增量和并发回收机制。在G1中,写屏障确保更新后的引用被正确标记和处理,从而避免漏标。

  • Shenandoah和ZGC

Shenandoah和ZGC是Java虚拟机中的低延迟垃圾收集器,它们利用读屏障和写屏障来支持并发标记和压缩。读屏障在这些垃圾收集器中尤为重要,因为它们需要处理对象在并发移动过程中被访问的情况。

总结

漏标和读写屏障是并发和增量垃圾收集器中关键的技术挑战和解决方案。通过使用读写屏障,垃圾收集器能够准确地跟踪对象引用的变化,确保在并发环境中正确标记和回收对象,避免漏标和浮动垃圾问题。这些技术的应用使得现代垃圾收集器能够在减少停顿时间的同时,保持高效的内存管理。

记忆集与卡表

记忆集(Remembered Set)和卡表(Card Table)是现代垃圾收集器中用于优化和管理内存的两个重要数据结构。它们主要用于分代垃圾收集(Generational Garbage Collection)策略中,以有效地跟踪跨代引用和改进垃圾收集性能。

记忆集

记忆集是一个数据结构,用于跟踪跨代引用,即从老年代(Old Generation)指向新生代(Young Generation)的引用。在分代垃圾收集器中,新生代垃圾收集(Minor GC)通常比老年代垃圾收集(Major GC)更频繁且更快。为了避免每次新生代垃圾收集都扫描整个老年代,记忆集记录了老年代中的哪些对象包含对新生代对象的引用。

记忆集的作用

  1. 减少扫描范围

在新生代垃圾收集时,只需扫描记忆集中记录的老年代对象,而不是整个老年代,从而提高效率。

  1. 跨代引用跟踪

确保所有从老年代到新生代的引用在垃圾收集过程中都能被正确处理,防止误回收仍在使用的对象。

记忆集的实现

1.对象粒度

记录具体哪些对象包含跨代引用。常用于较细粒度的跟踪,但可能增加开销。

2.卡表粒度

将内存分成固定大小的卡片(Card),记录哪些卡片包含跨代引用。这种方法比较粗粒度,但开销较小。

卡表

卡表是一个位图或数组,用于分代垃圾收集器中标记哪些内存区域(卡片)可能包含对新生代对象的引用。卡片是一段固定大小的内存块,卡表的每一位对应一张卡片。

卡表的作用

  1. 跨代引用跟踪

在对象引用发生变化时,通过写屏障更新卡表,标记那些可能包含跨代引用的卡片。

  1. 加速扫描

在新生代垃圾收集时,垃圾收集器只需扫描卡表中标记为脏的卡片,而不是整个老年代,从而提高垃圾收集的速度和效率。

卡表的实现

  1. 卡片大小

通常卡片大小为512字节到1KB,具体大小取决于实现和优化目标。

  1. 写屏障

在对象引用发生写操作时,写屏障会将相关的卡片标记为脏,以便在垃圾收集时进行检查。

应用实例

  • Java G1垃圾收集器

G1垃圾收集器使用记忆集和卡表来优化其分代垃圾收集机制。记忆集用于跟踪老年代中的跨代引用,而卡表用于快速标记哪些卡片可能包含跨代引用。在新生代垃圾收集时,G1只需扫描记忆集和卡表,从而减少了老年代的扫描开销。

  • HotSpot JVM

HotSpot JVM中的分代垃圾收集器(如Parallel GC、CMS)也广泛使用记忆集和卡表。写屏障用于在对象引用发生变化时更新卡表,确保跨代引用被正确标记和处理。

总结

记忆集和卡表是分代垃圾收集器中用于优化内存管理和垃圾收集性能的重要数据结构。记忆集通过记录跨代引用,减少了新生代垃圾收集时的扫描范围。卡表通过标记可能包含跨代引用的内存区域,加速了垃圾收集的过程。它们共同作用,使现代垃圾收集器能够高效地管理内存,同时保持较低的停顿时间。

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

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

相关文章

Hive的常规操作

Hive常规操作 hive常用交互命令 -e执行sql语句 [rootmaster ~]# hive -e "show databases";-f执行sql脚本 [rootmaster ~]# hive -f /usr/local/demo.sql查看hive中输入的所有命令 [rootmaster ~]# cat ~/.hivehistory操作库 创建库 语法: create…

用贪心算法计算十进制数转二进制数(整数部分)

十进制整数转二进制数用什么方法?网上一搜,大部分答案都是用短除法,也就是除2反向取余法。这种方法是最基本最常用的,但是计算步骤多,还容易出错,那么还有没有其他更好的方法吗? 一、短除反向取…

Stage #3 选择列表中的XSS注入:技巧与实操

在Web安全的学习旅程中,理解跨站脚本(XSS)攻击的多种形态至关重要。"XSS Challenges"闯关游戏的Stage #3专注于教授如何在选择列表中执行XSS注入。本文将详细介绍这一阶段的实操技巧和学习重点。 1. 挑战页面概览 学习者首先访问…

FreeRTOS学习笔记-基于stm32(8)消息队列

一、什么是消息队列 队列是不同任务、中断中数据传递的一种机制,又称消息队列。就类似于全局变量,将数据传输到不同的任务中。但全局变量没有写保护,容易造成数据受损。而消息队列中加入了进入临界区的写保护。 队列类似于数组,可…

关于WIN环境下pip DeepSpeed安装报错问题

问题描述 安装resemble-enhance项目时遇到的问题: >>> ERROR 1error: subprocess-exited-with-errorpython setup.py egg_info did not run successfully.exit code: 1[15 lines of output]test.cLINK : fatal error LNK1181: cannot open input file aio.libTraceb…

一维时间序列信号的基于小波集的时频超分辨率分析方法(Python)

由于小波变换只能反映信号的零维奇异性,即只能表达奇异点的位置和特性。事实上具有线奇异的函数在高维空间中非常普遍,例如,自然物体光滑边界使得自然图像的不连续性往往体现为光滑曲线上的奇异性,而并不仅仅是点奇异。对于一个二…

如何科学识别solidworks价格是否合理

Solidworks作为一款在很多领域中都非常重要的设计管理软件而备受人们的关注,该类软件在国内相关渠道中持续得到很多技术单位及行业内人士的喜爱和信任,在人们购买该软件的时候关于各类线上及线下渠道的solidworks都有很大的兴趣。接下来主要分析下如何科…

人工智能专业现代学徒制人才培养质量评价体系构建

一、 引 言 随着信息时代的发展,人工智能(AI)技术的飞跃进步对各行各业产生了深远影响,对专业人才的培养提出了更高要求。现代学徒制作为一种创新人才培养模式,通过校企合作,强调理论与实践的深度结合&…

性能测试学习-基本使用-元件组件介绍(二)

jmeter优点是:开源免费,小巧,丰富的学习资料和扩展组件 缺点是:1.不支持IP欺骗,分析和报表能力相对于LR欠缺精确度(以分钟为单位) 工具用户量分析报表IP欺骗费用体积扩展性Loadrunner多(万)精…

Lumière:开创性的视频生成模型及其应用

视频内容创造领域迎来了突破性进展,但视频生成模型由于运动引入的复杂性而面临更多挑战。这些挑战主要源自运动的引入所带来的复杂性。时间连贯性是视频生成中的关键要素,模型必须确保视频中的运动在时间上是连贯和平滑的,避免出现不自然的跳…

LVS精益价值管理系统 LVS.Web.ashx SQL注入漏洞复现

0x01 产品简介 LVS精益价值管理系统是杭州吉拉科技有限公司研发的一款专注于企业精益化管理和价值流优化的解决方案。该系统通过集成先进的数据分析工具、可视化的价值流映射技术和灵活的流程改善机制,帮助企业实现高效、低耗、高质量的生产和服务。 0x02 漏洞概述 LVS精益…

记录岁月云明细账excel导出的性能优化

财务软件报表还是非常麻烦,因为使用excel最好的就是财务,但是通过java导出excel,使用easyexcel不用报表工具,不是这么容易。采用jprofile对一个导出操作进行监控,其中一家零售企业导出当月全部明细账,检测到…

PostgreSQL的视图pg_namespace

PostgreSQL的视图pg_namespace 基础信息 OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本:16.2 pg软件目录:/home/pg16/soft pg数据目录:/home/pg16/data 端口:5777在 PostgreSQL 中,…

鬼刀画风扁平化粒子炫动引导页美化版

源码介绍 分享一款引导页,响应式布局,支持移动PC 添加背景图片,美化高斯模糊 ,删除蒙版人物部分,更图片人物画风更美好 删除雪花特效 替换字体颜色 添加底备案号 预留友情连接 效果预览 源码下载 https://www.qqmu.com/3381.h…

‘yarn’不是内部或外部命令,也不是可运行的程序或批处理文件。

目录 问题点 解决方式 # 安装 # 版本 # 本地发生变化(了解) # 安装项目依赖 新问题 解决方式 问题点 在vscode中,点击dev运行,项目报错【Q1】 * 正在执行任务: yarn run dev yarn : 无法将“yarn”项识别为 cmdlet、函数…

AI生成PPT:一键式演示文稿制作的秘诀

工欲善其事,必先利其器。 随着AI技术与各个行业或细分场景的深度融合,日常工作可使用的AI工具呈现出井喷式发展的趋势,AI工具的类别也从最初的AI文本生成、AI绘画工具,逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…

OrangePi Kunpeng Pro套装测评:开箱与基本功能测试

前言 大家好,我是起个网名真难。非常荣幸受到香橙派的邀请,同时也是第一次做这个事情,很荣幸对香橙派与华为鲲鹏在2024年5月12日联合发布的新品——香橙派Kunpeng Pro开发板进行深入的评测。这款开发板是香橙派与华为鲲鹏合作推出的高性能平…

中信建投证券信息技术部PMO高级经理张子洋受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 中信建投证券股份有限公司信息技术部PMO高级经理张子洋先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾,演讲议题为“浅谈项目管理标准化的建设及实践分享”。大会将于6月29-30日在北京举办,敬请关注! 议题…

解析建筑行业人防工程乙级资质最新标准

企业基本条件: 独立法人资格:申请企业需具备独立的法人资格,能够独立承担民事责任。注册资本:企业的注册资本不应少于100万元人民币,以证明其有足够的资金实力进行业务运营。业务经验:企业应从事建筑工程设…

C# 校验Json格式

错误json:错误值 -2146.379 [{"Key": "surface_heights_average","Value": "-2122.739nm","Description": "surface_heights_average"}, {"Key": "surface_heights_max","V…