Java 零星长时间ParNew GC,vmop GenCollectForAllocation中的持续时间

Java 零星长时间ParNew GC,vmop GenCollectForAllocation中的持续时间,java,garbage-collection,oracle-coherence,Java,Garbage Collection,Oracle Coherence,我们经营Oracle Coherence Java HotSpot(TM) 64-Bit Server VM (25.92-b14) for linux-amd64 JRE (1.8.0_92-b14) 它会触发很少的完全GC,但会触发很多次要GC,大多数都在20毫秒以下。偶尔,我们会得到一个长时间的小GC,如下所示: 2020-02-04T23:23:11.589+0100: 190856.335: [GC (Allocation Failure) 2020-02-04T23:23:15.5

我们经营Oracle Coherence

Java HotSpot(TM) 64-Bit Server VM (25.92-b14) for linux-amd64 JRE (1.8.0_92-b14)
它会触发很少的完全GC,但会触发很多次要GC,大多数都在20毫秒以下。偶尔,我们会得到一个长时间的小GC,如下所示:

2020-02-04T23:23:11.589+0100: 190856.335: [GC (Allocation Failure) 2020-02-04T23:23:15.545+0100: 190860.291: [ParNew
Desired survivor size 178946048 bytes, new threshold 15 (max 15)
- age   1:    1020040 bytes,    1020040 total
- age   2:     178320 bytes,    1198360 total
- age   3:     242304 bytes,    1440664 total
- age   4:      74328 bytes,    1514992 total
- age   5:     173944 bytes,    1688936 total
- age   6:     116680 bytes,    1805616 total
- age   7:        744 bytes,    1806360 total
- age   8:         96 bytes,    1806456 total
- age  12:      56800 bytes,    1863256 total
- age  14:         96 bytes,    1863352 total
- age  15:      56960 bytes,    1920312 total
: 357855K->5553K(699072K), 0.0133748 secs] 668006K->315703K(5941952K), 3.9693349 secs] [Times: user=0.22 sys=0.01, real=3.97 secs]
2020-02-04T23:23:15.559+0100: 190860.305: Total time for which application threads were stopped: 3.9703317 seconds, Stopping threads took: 0.0001269 seconds
如你所见,总时钟时间为3.97秒。此持续时间也在总GC时间(3.9693349秒)和应用程序线程停止的时间中报告,但不在ParNew GC时间(仅为0.0133748)中报告。Eden和幸存者报告的大小与快速GC中的相似。多亏了
-XX:+PrintSafepointStatistics
,JVM为GC打印了这个细分:

   vmop      [threads: total initially_running wait_to_block]  [time: spin block sync cleanup vmop] page_trap_count
190852.438: GenCollectForAllocation   [  167    1     1  ]      [ 0     0     0     0    24    ]  0
190856.328: GenCollectForAllocation   [  167    1     1  ]      [ 0     0     0     0  3969    ]  0
190860.312: RevokeBias                [  167    1     2  ]      [ 0     0     0     0     0    ]  1
190860.312: RevokeBias                [  168    0     3  ]      [ 0     0     3     0     0    ]  0
190860.312: ThreadDump                [  168    0     0  ]      [ 0     0     0     0     2    ]  0
也就是说,对于
GenCollectForAllocation
,大部分时间被报告为
vmop
时间,我理解为GC操作本身。因此,几乎没有时间达到安全点状态。原因可能是什么?可能的解决方案

提前谢谢


这一段是后来添加的。正如等待I/O的进程数量所报告的那样,我们发现这些长的次要GC与较差的I/O性能之间存在相关性。这就指向了这篇伟大的文章所解释的问题:。这个问题的一个症状是real和user+sys之间的时间差很大,正如我们所看到的。我们甚至考虑了一个本文未引用的可能解决方案:放弃打印GC日志。但最后,由于磁盘硬件的更改消除了I/O效率低下的问题,这就解决了一个很小的GC问题,所以不需要这样做。

老实说,我对日志的格式理解不太清楚-您是否碰巧对其进行了中继?但如果这对年轻一代来说真的那么多,听起来你有一大堆从老到新的引用(记住的集合和/或卡片表响了吗?),但无论如何你需要发布详细的日志,它不可能告诉别人发生了什么。主要GC消息可能有一个不寻常的外观,因为选项<代码> -XX:+PrttTururink分发< /代码>打印了在已知GC消息的中间每个年龄的幸存者对象内存的崩溃。如果我们删除它,它看起来会更熟悉:
2020-02-04T23:23:11.589+0100:190856.335:[GC(分配失败)2020-02-04T23:23:15.545+0100:190860.291:[ParNew:357855K->5553K(699072K),0.0133748秒]668006K->315703K(5941952K),3.9693349秒][次:user=0.22 sys=0.01,real=3.97秒]
,,例如,您可能需要启用跟踪以了解实际情况。顺便说一句,vmop是safepoint请求(它代表
VM操作
),老实说,我不太了解日志的格式-您是否碰巧对其进行了中继?但如果这对年轻一代来说真的那么多,听起来你有一大堆从老到新的引用(记住的集合和/或卡片表响了吗?),但无论如何你需要发布详细的日志,它不可能告诉别人发生了什么。主要GC消息可能有一个不寻常的外观,因为选项<代码> -XX:+PrttTururink分发< /代码>打印了在已知GC消息的中间每个年龄的幸存者对象内存的崩溃。如果我们删除它,它看起来会更熟悉:
2020-02-04T23:23:11.589+0100:190856.335:[GC(分配失败)2020-02-04T23:23:15.545+0100:190860.291:[ParNew:357855K->5553K(699072K),0.0133748秒]668006K->315703K(5941952K),3.9693349秒][次:user=0.22 sys=0.01,real=3.97秒]
,,您可能需要启用跟踪以了解实际情况。顺便说一句,vmop是safepoint请求(它代表
VM操作
),例如。