我很难在我们的生产JVM上找到“完整的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] “堆检查启动GC"到底是什么意思?这次检查是谁发起的?为什么?除了jmap、jmc等工具带来的信息外,我没有找到任何有意义的信息。我们不用的。
任何暗示或指示都会受到高度赞赏。
发布于 2020-01-18 21:12:54
JVM代理可以触发堆检查。要了解当前对象的活性,需要触发一个Full GC调用。我想,在Shenandoah和/或ZGC的情况下,这会“便宜得多”,因为它们与您的应用程序同时工作。更有趣的是,至少从理论上讲,并发GC不需要触发所有的阶段(mark就足够了)来发现什么是活的和/或死的。然而,我怀疑他们也不做compaction。
如果您真的关心STW事件,那么ParallelGC可能不是一个很好的选择。以垃圾算法的名字命名的Parallel应该引起注意:它的所有阶段都与应用程序并行,而不是并发的。
发布于 2020-01-18 19:38:25
Heap_Inspection_Initiated_GC GC是由堆上的检查操作启动的。例如,您可以使用jmap触发此操作: $ jmap -histo:live
另见JMC飞行记录力满GC吗? (答案是:如果启用堆统计,则为是)
另见在收集数据之前调用完整的GC? (回答:是)
https://stackoverflow.com/questions/59803823
复制相似问题