我在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.0M
,Survivor
变得更大以10016 M
。既然你设置了InitiatingHeapOccupancyPercent = 70
,当伊甸园那么大时,这永远不会发生,这个值永远不会达到 70%。想想看,你说:"当我占老一代总堆的 70% 时启动一个标记阶段";但是你的伊甸园占堆的50%... 这只是这里的一个小观察。
至于为什么会触发这一点 - 这很明显:你的伊甸园已经满了(81184.0M(81184.0M)
(。至于为什么initial-mark
也?它总是作为年轻集合的一部分触发。
第三点
我不确定我是否理解你的意思。它在日志中清楚地说,initial-mark
,即STW event
,做young GC
。