Java 零星长时间ParNew GC,vmop GenCollectForAllocation中的持续时间
我们经营Oracle CoherenceJava 零星长时间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
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操作
),例如。