除了IHOP之外,G1 GC何时会触发初始标记



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

GC 日志摘录:

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

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

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 工作线程: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 毫秒]

[字符串重复修正:0.9 毫秒,GC 工作线程: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.0米(81920.0米(->0.0B(81184.0米(幸存者:0.0B->736.0米 堆:1472.0米(160.0克(->1179.5米(160.0克(]

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

2020-01-22T03:58:14.386+0000:3.316:[GC并发根区域扫描启动]

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

2020-01-22T03:58:14.458+0000:3.388:[GC 并发根区域扫描结束,0.0718879 秒]

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秒]

[时间:用户=0.19 系统=0.02,实际=0.02 秒]

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 秒]

[时间:用户=0.06 系统=0.00,实际=0.00 秒]

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

[并行时间:3822.9 毫秒,GC 工作线程: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 毫秒]

[字符串重复修正:1.1 毫秒,GC 工作线程: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.0米(81184.0米(->0.0B(71904.0米(幸存者:736.0米->10016.0米 堆:83643.5米(160.0克(->11744.0米(160.0克(]

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

嗯,其中一个很明显,它与Metaspace有关,这里有更多关于它的细节。我的意思是当触发完整 GC 时,初始阶段是mark.

我知道其他 3 种情况会触发标记阶段(请阅读下文(:

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

标记阶段之后会发生什么取决于一些参数,例如mixed GCs将取决于G1HeapWastePercent参数;但无论哪种方式,mark phase后都会触发young GC


第一点是,巨大的分配可能会启动一个并发循环,您可以自己分析它是否以及何时这样做。

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

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

[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)
]

这说明了一些事情。你的伊甸园80GB,其中70GB死物。因此,Eden减少到71904.0MSurvivor变得更大以10016 M。既然你设置了InitiatingHeapOccupancyPercent = 70,当伊甸园那么大时,这永远不会发生,这个值永远不会达到 70%。想想看,你说:"当我占老一代总堆的 70% 时启动一个标记阶段";但是你的伊甸园占堆的50%... 这只是这里的一个小观察。

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

第三点

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

最新更新