• JVM G1收集器几个重要的概念


    一、可预测停顿

    -XX:MaxGCPauseMillis 默认是200ms

    g1的可预测停顿是如何实现的

    G1垃圾收集器之所以能建立可预测的停顿时间模型,是因为他是有计划的规避了在整个JAVA堆里面进行全区域的垃圾收集。

    那是如何实现的呢?

    G1实现了一个合理的计算模型,这个模型能够计算出每个region的垃圾收集成本并量化,这样在给定一个停顿时间作为限制条件的情况下,模型总能计算出一组恰当的regions来作为收集目标,来达到这个限制条件,这样就能够进行实时的收集了。

    二、Rset Remembered Set

    讲到这个Remembered Set,那就得先说一下card table了,因为Remembered Set是在card table的基础上实现的。

    what's card table

    该项技术把堆划分成一个个大小512字节的卡,同时维护一张卡表,卡表记录每张卡对应的标识,这个标识是啥呢,就是记录当前的region是否有指向其他region(比如年轻代)的引用。如果有就记录一个标识。并且认为这张卡是脏的。

    这样做的用处是啥呢,

    背景:老年代的对象可能引用新生代的对象,那标记存活对象的时候,需要扫描老年代中的所有对象。这样成本太高了。

    所以就有了card table

    G1在mixed Gc的时候,会去扫码card table 而不用去扫描整个老年代的region. 将卡表里面的脏卡作为GC root对象。当完成//所有脏卡的扫描后,JVM虚拟机会吧卡表里面的脏卡标识清零。

    卡表能用于减少老年代的全堆空间扫描,这能很大的提升GC效率。

    其实最大的作用体现在Remembered Set, 再次回到Remembered Set,她的结构其实是一个Hash Table,Key是别的Region的起始地址,Value是一个集合,里面的元素是Card Table的Index。他记录的信息刚好和card table是相反的。他是记录其他Region中的对象引用本Region中对象的关系(谁引用了我的对象),card table(我引用了谁的对象),

    那Rset是如何辅佐GC的呢?

    首先Young GC来看,只需要选定young generation region的RSet作为根集,这些RSet记录了old->young的跨代引用,避免了扫描整个old generation。

    然后看一下Mixed GC, old generation中记录了old->old的RSet,young->old的引用由扫描全部young generation region得到,这样也不用扫描全部old generation region。所以RSet的引入大大减少了GC的工作量。

    什么时候需要考虑从CMS或者parallelOld收集器迁移到G1呢

    官方给出三个条件

    1. 想要更短的GC停顿时间(超过0.5s-1s)

    2. 实时数据超过了整个堆的50%

    3. 对象分配率或者晋升的速度变化明显

    参考文献:

    弄明白CMS和G1,就靠这一篇了 - 腾讯云开发者社区-腾讯云

    Java Hotspot G1 GC的一些关键技术 - 美团技术团队

  • 相关阅读:
    【JavaSpring】Aop的通知类型,获取数据
    数据结构与算法复习:第三十五弹
    力扣最热一百题——每日温度
    Win10下使用WinSCP+PuTTY实现远程文件操作和终端访问
    亿道丨三防平板丨加固平板丨为零售业提供四大优势
    推演语言模型的大小与计算开销
    缓冲区的管理
    线程中的LockSapport于线程中断(一)
    VL系列 Exchanging-based Multimodal Fusion with Transformer 论文阅读笔记
    60 个深度学习教程:包含论文、实现和注释 | 开源日报 No.202
  • 原文地址:https://blog.csdn.net/crazyzhb2012/article/details/127685056