Full GC(堆检查启动的GC)
Full GC (Heap Inspection Initiated GC)
我正在努力寻找我们生产 JVM 上的 "Full GC"。每天午夜前后,STW 都会无缘无故地发生,在 10-11 秒内相当致命。这是 gc 日志:
Java HotSpot(TM) 64-Bit Server VM (25.131-b11) for windows-amd64 JRE (1.8.0_131-b11), built on Mar 15 2017 01:23:53 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 16584284k(13074876k free), swap 23137624k(18439472k free)
CommandLine flags: -XX:GCLogFileSize=1024000 -XX:InitialHeapSize=11811160064 -XX:+ManagementServer -XX:MaxHeapSize=11811160064 -XX:NumberOfGCLogFiles=10 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseGCLogFileRotation -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
...
2020-01-17T00:00:04.411+0200: 113734.053: [GC (Heap Inspection Initiated GC) [PSYoungGen: 522474K->146371K(3387904K)] 6946079K->6573263K(11077632K), 0.1786961 secs] [Times: user=0.67 sys=0.02, real=0.18 secs]
2020-01-17T00:00:04.592+0200: 113734.233: [Full GC (Heap Inspection Initiated GC) [PSYoungGen: 146371K->0K(3387904K)] [ParOldGen: 6426892K->3217828K(7689728K)] 6573263K->3217828K(11077632K), [Metaspace: 81937K->81809K(1126400K)], 11.4447857 secs] [Times: user=44.06 sys=0.20, real=11.44 secs]
"Heap Inspection Initiated GC"究竟是什么意思?谁发起这项检查,为什么?除了它是由一些我们不使用的工具(如 jmap、jmc..)引起的之外,我没有找到任何关于它的有意义的信息。
非常感谢任何提示或指导。
引用 Spectator Docs - GC Causes:
Heap_Inspection_Initiated_GC
GC was initiated by an inspection operation on the heap. For example you can trigger this with jmap:
$ jmap -histo:live <pid>
另见 Does JMC Flight Recording force Full GC?(答案:是的,如果启用堆统计)
另请参阅 (答案:是)
一个 JVM
代理可以触发一个 heap inspection too。要了解当前对象的活跃度,您需要触发一个 Full GC
调用。我想在 Shenandoah
and/or ZGC
的情况下,这会很多 "cheaper",因为它们与您的应用程序同时工作。更有趣的是,至少在理论上,并发 GC
不需要触发 所有 个阶段(mark
就足够了)来找到什么是活and/or死了。但是,我怀疑他们不会 compaction
也。
如果您真的关心 STW
事件,ParallelGC
可能不是一个很好的开始选择。 Parallel
垃圾算法的名字应该敲响警钟:它的所有阶段都与应用程序并行; 不是并发。
我正在努力寻找我们生产 JVM 上的 "Full GC"。每天午夜前后,STW 都会无缘无故地发生,在 10-11 秒内相当致命。这是 gc 日志:
Java HotSpot(TM) 64-Bit Server VM (25.131-b11) for windows-amd64 JRE (1.8.0_131-b11), built on Mar 15 2017 01:23:53 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 16584284k(13074876k free), swap 23137624k(18439472k free)
CommandLine flags: -XX:GCLogFileSize=1024000 -XX:InitialHeapSize=11811160064 -XX:+ManagementServer -XX:MaxHeapSize=11811160064 -XX:NumberOfGCLogFiles=10 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseGCLogFileRotation -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
...
2020-01-17T00:00:04.411+0200: 113734.053: [GC (Heap Inspection Initiated GC) [PSYoungGen: 522474K->146371K(3387904K)] 6946079K->6573263K(11077632K), 0.1786961 secs] [Times: user=0.67 sys=0.02, real=0.18 secs]
2020-01-17T00:00:04.592+0200: 113734.233: [Full GC (Heap Inspection Initiated GC) [PSYoungGen: 146371K->0K(3387904K)] [ParOldGen: 6426892K->3217828K(7689728K)] 6573263K->3217828K(11077632K), [Metaspace: 81937K->81809K(1126400K)], 11.4447857 secs] [Times: user=44.06 sys=0.20, real=11.44 secs]
"Heap Inspection Initiated GC"究竟是什么意思?谁发起这项检查,为什么?除了它是由一些我们不使用的工具(如 jmap、jmc..)引起的之外,我没有找到任何关于它的有意义的信息。
非常感谢任何提示或指导。
引用 Spectator Docs - GC Causes:
Heap_Inspection_Initiated_GC
GC was initiated by an inspection operation on the heap. For example you can trigger this with jmap:
$ jmap -histo:live <pid>
另见 Does JMC Flight Recording force Full GC?(答案:是的,如果启用堆统计)
另请参阅
一个 JVM
代理可以触发一个 heap inspection too。要了解当前对象的活跃度,您需要触发一个 Full GC
调用。我想在 Shenandoah
and/or ZGC
的情况下,这会很多 "cheaper",因为它们与您的应用程序同时工作。更有趣的是,至少在理论上,并发 GC
不需要触发 所有 个阶段(mark
就足够了)来找到什么是活and/or死了。但是,我怀疑他们不会 compaction
也。
如果您真的关心 STW
事件,ParallelGC
可能不是一个很好的开始选择。 Parallel
垃圾算法的名字应该敲响警钟:它的所有阶段都与应用程序并行; 不是并发。