【问题标题】:When will G1 GC trigger initial-mark besides IHOP除了 IHOP,G1 GC 什么时候触发 initial-mark
【发布时间】:2020-05-16 07:27:46
【问题描述】:

我在JDK8中设置了-XX:InitiatingHeapOccupancyPercent=70(没有自适应IHOP特性),但是我发现JVM启动开始时有两个initial-mark阶段,此时HeapOccupancyPercent远小于70%,是否有其他因素哪个会触发 G1 GC 初始标记阶段?提前致谢!

GC 日志摘录:

2020-01-22T03:58:14.227+0000: 3.158: [GC 暂停(元数据 GC 阈值)(年轻)(初始标记),0.1583711 秒] [伊甸园:1056.0M(81920.0M)->0.0B(81184.0M) 幸存者:0.0B->736.0M 堆:1472.0M(160.0G)->1179.5M(160.0G)]

2020-01-22T04:13:07.073+0000:896.004:[GC 暂停(G1 疏散暂停)(年轻)(初始标记),3.8512514 秒] [伊甸园:81184.0M(81184.0M)->0.0B(71904.0M) 幸存者:736.0M->10016.0M 堆:83643.5M(160.0G)->11744.0M(160.0G)]

JDK版本:

openjdk 版本“1.8.0_222”

OpenJDK 运行时环境(内部版本 1.8.0_222-b10)

OpenJDK 64 位服务器 VM(内部版本 25.222-b10,混合模式)

谢谢

******2020/02/01 GC 日志更新************

2020-01-22T03:58:14.227+0000: 3.158: [GC 暂停(元数据 GC 阈值)(年轻)(初始标记),0.1583711 秒]

[并行时间:143.8 毫秒,GC Workers:33]

 [GC Worker Start (ms): Min: 3158.7, Avg: 3159.4, Max: 3159.8, Diff: 1.1]

 [Ext Root Scanning (ms): Min: 0.6, Avg: 1.1, Max: 2.7, Diff: 2.1, Sum: 35.9]

 [Update RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1]

    [Processed Buffers: Min: 0, Avg: 0.1, Max: 2, Diff: 2, Sum: 4]

 [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.2]

 [Code Root Scanning (ms): Min: 0.0, Avg: 0.3, Max: 5.9, Diff: 5.9, Sum: 8.5]

 [Object Copy (ms): Min: 135.7, Avg: 141.1, Max: 141.5, Diff: 5.9, Sum: 4654.7]

 [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.7]

    [Termination Attempts: Min: 1, Avg: 9.1, Max: 15, Diff: 14, Sum: 301]

 [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.9]

 [GC Worker Total (ms): Min: 142.0, Avg: 142.5, Max: 143.1, Diff: 1.1, Sum: 4701.0]

 [GC Worker End (ms): Min: 3301.8, Avg: 3301.9, Max: 3301.9, Diff: 0.1]

[代码根修复:0.1 毫秒]

[代码根清除:0.0 ms]

[String Dedup Fixup:0.9 ms,GC Workers:33]

 [Queue Fixup (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]

 [Table Fixup (ms): Min: 0.0, Avg: 0.0, Max: 0.7, Diff: 0.7, Sum: 0.7]

[清除 CT:0.4 毫秒]

[其他:13.1 毫秒]

 [Choose CSet: 0.0 ms]

 [Ref Proc: 9.4 ms]

 [Ref Enq: 0.9 ms]

 [Redirty Cards: 0.6 ms]

 [Humongous Register: 0.2 ms]

 [Humongous Reclaim: 0.0 ms]

 [Free CSet: 0.1 ms]

[伊甸园:1056.0M(81920.0M)->0.0B(81184.0M) 幸存者:0.0B->736.0M 堆:1472.0M(160.0G)->1179.5M(160.0G)]

[时间:用户=1.77 系统=2.98,实际=0.15 秒]

2020-01-22T03:58:14.386+0000: 3.316: [GC concurrent-root-region-scan-start]

2020-01-22T03:58:14.458+0000:3.388: [GC 并发标记开始]

2020-01-22T03:58:14.458+0000: 3.388: [GC concurrent-root-region-scan-end, 0.0718879 secs]

2020-01-22T03:58:14.485+0000:3.416:[GC 备注 2020-01-22T03:58:14.485+0000:3.416:[完成标记,0.0011542 秒]2020-01-22T03:58:14.486 +0000: 3.417: [GC ref-proc, 0.0072547 秒] 2020-01-22T03:58:14.494+0000: 3.424: [卸载, 0.0050159 秒], 0.0151448 秒]

[Times: user=0.19 sys=0.02, real=0.02 secs]

2020-01-22T03:58:14.485+0000: 3.415: [GC 并发标记结束,0.0271495 秒]

2020-01-22T03:58:14.500+0000: 3.431: [GC 清理 1259M->1259M(160G), 0.0033890 秒]

[时间:user=0.06 sys=0.00, real=0.00 secs]

2020-01-22T04:13:07.073+0000:896.004:[GC 暂停(G1 疏散暂停)(年轻)(初始标记),3.8512514 秒]

[并行时间:3822.9 毫秒,GC Workers:33]

 [GC Worker Start (ms): Min: 896005.5, Avg: 896006.2, Max: 896006.6, Diff: 1.1]

 [Ext Root Scanning (ms): Min: 4.3, Avg: 5.3, Max: 8.4, Diff: 4.1, Sum: 175.2]

 [Update RS (ms): Min: 0.0, Avg: 0.2, Max: 0.8, Diff: 0.8, Sum: 7.6]

    [Processed Buffers: Min: 0, Avg: 1.3, Max: 6, Diff: 6, Sum: 44]

 [Scan RS (ms): Min: 2254.9, Avg: 2266.4, Max: 2268.2, Diff: 13.3, Sum: 74790.0]

 [Code Root Scanning (ms): Min: 0.0, Avg: 0.7, Max: 10.4, Diff: 10.4, Sum: 23.8]

 [Object Copy (ms): Min: 1535.2, Avg: 1537.7, Max: 1548.1, Diff: 13.0, Sum: 50745.7]

 [Termination (ms): Min: 0.0, Avg: 11.2, Max: 13.3, Diff: 13.2, Sum: 368.0]

    [Termination Attempts: Min: 1, Avg: 2270.1, Max: 2464, Diff: 2463, Sum: 74914]

 [GC Worker Other (ms): Min: 0.0, Avg: 0.2, Max: 0.5, Diff: 0.5, Sum: 8.1]

 [GC Worker Total (ms): Min: 3821.2, Avg: 3821.8, Max: 3822.5, Diff: 1.3, Sum: 126118.4]

 [GC Worker End (ms): Min: 899827.7, Avg: 899827.9, Max: 899828.2, Diff: 0.5]

[代码根修复:0.5 毫秒]

[代码根清除:0.1 毫秒]

[String Dedup Fixup:1.1 ms,GC Workers:33]

 [Queue Fixup (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]

 [Table Fixup (ms): Min: 0.0, Avg: 0.1, Max: 1.0, Diff: 1.0, Sum: 1.9]

[清除 CT:4.7 毫秒]

[其他:21.9 毫秒]

 [Choose CSet: 0.0 ms]

 [Ref Proc: 8.5 ms]

 [Ref Enq: 0.9 ms]

 [Redirty Cards: 4.1 ms]

 [Humongous Register: 0.2 ms]

 [Humongous Reclaim: 0.0 ms]

 [Free CSet: 6.2 ms]

[伊甸园:81184.0M(81184.0M)->0.0B(71904.0M) 幸存者:736.0M->10016.0M 堆:83643.5M(160.0G)->11744.0M(160.0G)]

[时间:用户=50.77 系统=10.33,真实=3.85 秒]

【问题讨论】:

    标签: jvm g1gc


    【解决方案1】:

    其中一个很明显,它与Metaspacehere are more details about it 有关。我的意思是当触发 Full GC 时,初始阶段是mark

    我知道会触发标记阶段(见下文)的其他 3 种情况:

     1) IHOP is reached
     2) G1ReservePercent is reached
     3) a humongous allocation happens  
    

    标记阶段之后发生的事情取决于几个参数,例如mixed GCs 将取决于G1HeapWastePercent 参数;但无论哪种方式,young GC 都会在mark phase 之后触发无论如何


    第一点是一个巨大的分配might start一个并发循环,你可以分析yourself是否以及何时这样做。

    第二点(来自您的 cmets):我是说一般而言,这是触发并发标记阶段的原因,而不是针对您的具体情况.

    但是让我们看看你的日志(我稍微格式化了它):

    [GC pause (G1 Evacuation Pause) (young) (initial-mark), 3.8512514 secs]    
        [  Eden: 81184.0M(81184.0M)->0.0B(71904.0M) 
           Survivors: 736.0M->10016.0M 
           Heap: 83643.5M(160.0G)->11744.0M(160.0G)
        ]
    

    这表明了一些事情。你的伊甸园是80GB70GB 其中的死对象。因此,Eden 被缩减为71904.0MSurvivor 被扩大为10016 M。由于您设置了InitiatingHeapOccupancyPercent = 70,当 Eden 那么 大时,这将永远不会发生,这个值永远不会达到 70%。想想看,你说:“当我在老年代占总堆的 70% 时,启动一个标记阶段”;但是你的伊甸园是堆的 50%...这只是一个小观察。

    至于为什么会触发 - 这很明显:您的伊甸园已满 (81184.0M(81184.0M))。至于为什么initial-mark ?它总是作为年轻集合的一部分被触发。

    第三点

    我不确定我是否理解您的意思。它在日志中清楚地表明initial-mark,即STW event,即young GC

    【讨论】:

    • 感谢尤金的评论!关于 3) 发生了巨大的分配,我有不同的想法。分配了许多巨大的反对(50+),但不会触发这么多的初始标记。
    • 关于 2) 达到 G1ReservePercent,我也有不同的想法。 JVM启动之初,max used heap 80G(总堆160G),gc log中没有to-space溢出。
    • 关于“我的意思是触发Full GC时,初始阶段是mark。”,我认为是并发标记周期而不是Full GC。我的假设是基于 gc 原因“[GC pause (Metadata GC Threshold) (young) (initial-mark)”,如果有任何不同的想法,请随时告诉我,谢谢!
    • 感谢您的评论,关于“第三点”,您提到“发生了巨大的分配”将触发标记阶段。我不认为是这样,这是我的观点,希望它澄清。谢谢!
    • @RoyZhang 你不认为 your 的情况是这样吗?这意味着您不认为您提供的日志(包含(G1 Evacuation Pause) (young) (initial-mark) 的日志)是由巨大的分配触发的。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多