城市建设局网站,网络推广有哪些途径,wordpress如何增加page样式,徐州建站1 MixedGC基本过程 在G1GC中#xff0c;有两种主要的垃圾回收过程#xff1a;Young GC和Mixed GC。这两者都是为了回收堆内存中的垃圾对象#xff0c;但是他们关注的区域和工作方式有所不同。
Young GC#xff1a;
Young GC主要负责回收Young Generation#xff08;包括… 1 MixedGC基本过程 在G1GC中有两种主要的垃圾回收过程Young GC和Mixed GC。这两者都是为了回收堆内存中的垃圾对象但是他们关注的区域和工作方式有所不同。
Young GC
Young GC主要负责回收Young Generation包括Eden区和Survivor区。大多数新创建的对象都首先在Eden区分配在一段时间后如果这些对象仍然存活它们将被移动到Survivor区或Old区。Young GC通常会频繁发生因为大多数对象的生命周期都很短很快就会变成垃圾可以被回收。
Mixed GC
与Young GC不同Mixed GC不仅回收Young Generation还会回收部分Old Generation。Mixed GC发生的条件是在并发标记周期结束后也就是说它会在完成全堆的并发标记之后进行。在Mixed GC中G1GC会选择一些可以回收的老年代区域进行清理这样可以在不进行Full GC的情况下尽可能地清理掉一些长时间存活的垃圾对象
在G1GC中实际上只有YoungGC. 或者说MixedGc是跟随YoungGC 1 Mixed GC触发条件
1如果堆内存的使用率超过了一个阈值默认是45%可以通过-XX:InitiatingHeapOccupancyPercent参数进行调整那么将会启动一个并发周期而Mixed GC则在并发周期结束后开始。 2老年代的区域已经满了。G1GC会尽可能地避免Full GC所以当老年代的区域已经满了并且并发标记已经完成G1GC会触发Mixed GC以回收老年代的部分区域 老年代的使用率达到 -XX:G1OldCSetRegionThresholdPercent 参数设置的阈值G1 GC 将会尽管不满足 G1HeapWastePercent 的要求也会强制执行 Mixed GC以防止老年代填满导致 Full GC MixedGC阶段 1初始标记阶段 这个过程需要进入Stop the World的仅仅只是标记一下GC Roots直接能引用的对象这个过程速度是很快的。如下图先停止系统程序的运行然后对各个线程栈内存中的局部变量代表的GC Roots以及方法区中的类静态变量代表的GC Roots进行扫描标记出来他们直接引用的那些对象 2并发标记阶段 这个阶段会允许系统程序的运行同时进行GC Roots追踪从GC Roots开始追踪所有的存活对象并对这个过程对象的变化做记录比如哪些对象失去了引用哪些对象是新建的。如下图所示。这个阶段也是很耗时的要追踪全部存活的对象但跟系统并发运行影响不大
3最终标记阶段 这个阶段会进入Stop the World系统程序是禁止运行的但是会根据并发标记阶段记录的那些对象修改最终标记一下有哪些存活对象有哪些是垃圾对象。
4混合回收阶段 计算存活对象数量在并发标记阶段垃圾收集器会遍历对象图并标记存活对象。这个过程可以帮助G1GC了解每个区域的存活对象数量。 计算回收收益根据每个区域的存活对象数量G1GC会计算回收收益即回收某个区域可以释放多少空间。 选择回收集合在计算完回收收益后G1GC会根据预设的暂停时间目标例如通过-XX:MaxGCPauseMillis参数设置来选择哪些区域应该被包含在回收集合中。这个过程中G1GC会优先选择回收收益较高的区域。 这个阶段G1允许多次执行混合回收也就是说先停止系统工作执行回收恢复系统运行再停止系统运行再回收再恢复…这么一个流程。每次回收的间隔是由G1自己控制的回收执行次数可以通过参数-XX:G1MixedGCCountTarget来设置这个参数默认回收次数是8次同时有一个参数-XX:G1HeapWastePercent默认值是整个堆大小5%就是说当前回收集合内即将空出来的区域大于整个堆的5%就会立即停止混合回收了。正常默认回收次数是8次但是可能到了4次发现空闲Region大于整个堆的5%就不会再进行后续回收了。 G1HeapWastePercent参数默认5%控制了回收集合内总的region的内存大小 设置太大 则经过可能最多8次后还是达不到条件这个阈值。这可能会导致垃圾回收的暂停时间变长对应用程序的响应时间产生影响。 同时如果 G1 GC 将这种回收效益不高的 region 也加入到回收集合CSet中虽然能回收一些垃圾但大部分空间仍然被活动对象占据该 region 的空间利用率并未显著提高。 而实际上这些 region 的可回收空间并不多这就造成了空间的浪费。也导致额外的 CPU 时间被用于回收这些 region 如果内存使用效率较低可能间接导致内存使用率较快达到 IHOP 阈值 InitiatingHeapOccupancyPercent,从而导致频繁触发并发标记。 设置太小 导致mixed gc 很快就结束。进而导致很多需要回收的region得不到回收也会影响内存里利用率。能使堆内存使用率更容易达到 -XX:InitiatingHeapOccupancyPercentIHOP阈值从而触发更频繁的并发标记。 如果堆空间使用率持续上升可能会触发 Full GC从而导致更长的垃圾收集暂停时间。 如果发现老年代中可回收的对象不足以满足预设的暂停时间目标由 -XX:MaxGCPauseMillis 参数设置: G1 GC 可能会提前结束 Mixed GC 状态避免不必要的工作因为继续执行 Mixed GC 可能无法释放足够的空间却会消耗更多的 CPU 时间。 a通常是指老年代中可以被回收并释放的对象数量不足也就是说老年代中的大部分对象都还被程序所使用无法被回收。 b也可能是短寿命的对象这些对象在年轻代就被回收了而长寿命的对象通常会被分配到老年代相对较少。 当老年代中可回收的对象超过预设的暂停时间G1 GC 会提前结束 Mixed GC避免回收时间过长以尽量满足预设的暂停时间目标。 但是如果经常发生 这可能导致老年代中未回收的对象增加从而降低堆内存的使用效率。 如果经常出现这种情况可能需要调整 G1 GC 的配置参数或优化应用代码以减少老年代中的可回收对象。例如可以增加-XX:G1OldCSetRegionThresholdPercent和-XX:G1HeapWastePercent的值以允许 G1 GC 在 Mixed GC 阶段回收更多的老年代 Region或者优化应用代码以减少长寿命对象的生成。
对于已经被加入到 Collection Set (CSet) 中的 region无论它们是年轻代的还是老年代的G1 GC 都会在当前的 GC 周期中进行回收。 如果没有可回收对象则直接转YoungGC. 2 G1GC 新生代是动态的 -XX:G1NewSizePercent和-XX:G1MaxNewSizePercent分别为新生代比例的设定数值的下限和上限默认值分别为5%和60%。G1会根据实际的GC情况(主要是暂停时间)来动态的调整新生代的大小主要是调整Eden Region的个数。
以下是 G1 GC 动态调整新生代大小的几个重要因素
暂停时间目标G1 GC 通过 -XX:MaxGCPauseMillis 参数设置暂停时间目标。为了尽量满足这个目标G1 GC 可以根据前几次垃圾收集的数据动态地调整新生代的大小以影响下一次垃圾收集的暂停时间。
应用程序行为G1 GC 会根据应用程序的行为如对象分配速率和对象存活率动态地调整新生代的大小。对于分配密集型的应用G1 GC 可能会增大新生代的大小以容纳更多的对象。对于对象存活率高的应用G1 GC 可能会减小新生代的大小以避免存活对象过多导致的复制成本。
并发标记G1 GC 会尽量在并发标记阶段结束后立即触发一次 Mixed GC。为了保证并发标记能够在合适的时间结束G1 GC 会根据堆内存使用率和历史数据动态地调整新生代的大小。
因此新生代的动态性是 G1 GC 实现可预测的停顿时间和高吞吐量目标的一个重要方式。