Java GC(分配失败)
Java GC (Allocation Failure)
为什么总是"GC (Allocation Failure)"?
Java HotSpot(TM) 64 位服务器 VM (25.25-b02) 用于 linux-amd64 JRE (1.8.0_25-b17),
CommandLine flags:
-XX:CMSInitiatingOccupancyFraction=60
-XX:GCLogFileSize=10485760
-XX:+HeapDumpOnOutOfMemoryError
-XX:InitialHeapSize=32212254720
-XX:MaxHeapSize=32212254720
-XX:NewRatio=10
-XX:OldPLABSize=16
-XX:ParallelGCThreads=4
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintStringTableStatistics
-XX:+PrintTenuringDistribution
-XX:StringTableSize=1000003
-XX:SurvivorRatio=4
-XX:TargetSurvivorRatio=50
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
27.329: [GC (Allocation Failure) 27.329: [ParNew
Desired survivor size 44728320 bytes, new threshold 15 (max 15)
- age 1: 16885304 bytes, 16885304 total
: 349568K->16618K(436928K), 0.2069129 secs] 349568K->16618K(31369920K), 0.2070712 secs] [Times: user=0.78 sys=0.04, real=0.21 secs]
28.210: [GC (Allocation Failure) 28.210: [ParNew
Desired survivor size 44728320 bytes, new threshold 15 (max 15)
- age 1: 28866504 bytes, 28866504 total
- age 2: 12582536 bytes, 41449040 total
: 366186K->47987K(436928K), 0.2144807 secs] 366186K->47987K(31369920K), 0.2146024 secs] [Times: user=0.84 sys=0.01, real=0.22 secs]
29.037: [GC (Allocation Failure) 29.038: [ParNew
Desired survivor size 44728320 bytes, new threshold 2 (max 15)
- age 1: 28443488 bytes, 28443488 total
- age 2: 28386624 bytes, 56830112 total
- age 3: 12579928 bytes, 69410040 total
: 397555K->76018K(436928K), 0.2357352 secs] 397555K->76018K(31369920K), 0.2358535 secs] [Times: user=0.93 sys=0.01, real=0.23 secs]
"Allocation Failure" 是 GC 循环启动的原因。
"Allocation Failure" 表示伊甸园中不再有 space 分配对象。所以,这是年轻GC的正常原因。
较旧的 JVM 不打印 GC 原因是次要 GC 周期。
"Allocation Failure" 几乎是轻微 GC 的唯一可能原因。启动次要 GC 的另一个原因可能是 CMS 注释阶段(如果启用 +XX:+ScavengeBeforeRemark
)。
在jdk1.8使用CMS GC时会出现这个错误,我换了G1 Gc解决了这个问题。
-Xss512k -Xms6g -Xmx6g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=70 -XX:NewRatio=1 -XX:SurvivorRatio=6 -XX:G1ReservePercent=10 -XX:G1HeapRegionSize=32m -XX:ConcGCThreads=6 -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
"Allocation Failure"是GC踢不正确的原因。
这是GC操作的结果。
GC 在没有 space 分配时启动(取决于执行次要或主要 GC 的区域)。
如果 space 足够好,则执行 GC,但如果没有足够的大小,它将失败。
分配失败就是这样的失败之一。
下面的文档有很好的解释
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html
为什么总是"GC (Allocation Failure)"?
Java HotSpot(TM) 64 位服务器 VM (25.25-b02) 用于 linux-amd64 JRE (1.8.0_25-b17),
CommandLine flags:
-XX:CMSInitiatingOccupancyFraction=60
-XX:GCLogFileSize=10485760
-XX:+HeapDumpOnOutOfMemoryError
-XX:InitialHeapSize=32212254720
-XX:MaxHeapSize=32212254720
-XX:NewRatio=10
-XX:OldPLABSize=16
-XX:ParallelGCThreads=4
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintStringTableStatistics
-XX:+PrintTenuringDistribution
-XX:StringTableSize=1000003
-XX:SurvivorRatio=4
-XX:TargetSurvivorRatio=50
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
27.329: [GC (Allocation Failure) 27.329: [ParNew
Desired survivor size 44728320 bytes, new threshold 15 (max 15)
- age 1: 16885304 bytes, 16885304 total
: 349568K->16618K(436928K), 0.2069129 secs] 349568K->16618K(31369920K), 0.2070712 secs] [Times: user=0.78 sys=0.04, real=0.21 secs]
28.210: [GC (Allocation Failure) 28.210: [ParNew
Desired survivor size 44728320 bytes, new threshold 15 (max 15)
- age 1: 28866504 bytes, 28866504 total
- age 2: 12582536 bytes, 41449040 total
: 366186K->47987K(436928K), 0.2144807 secs] 366186K->47987K(31369920K), 0.2146024 secs] [Times: user=0.84 sys=0.01, real=0.22 secs]
29.037: [GC (Allocation Failure) 29.038: [ParNew
Desired survivor size 44728320 bytes, new threshold 2 (max 15)
- age 1: 28443488 bytes, 28443488 total
- age 2: 28386624 bytes, 56830112 total
- age 3: 12579928 bytes, 69410040 total
: 397555K->76018K(436928K), 0.2357352 secs] 397555K->76018K(31369920K), 0.2358535 secs] [Times: user=0.93 sys=0.01, real=0.23 secs]
"Allocation Failure" 是 GC 循环启动的原因。
"Allocation Failure" 表示伊甸园中不再有 space 分配对象。所以,这是年轻GC的正常原因。
较旧的 JVM 不打印 GC 原因是次要 GC 周期。
"Allocation Failure" 几乎是轻微 GC 的唯一可能原因。启动次要 GC 的另一个原因可能是 CMS 注释阶段(如果启用 +XX:+ScavengeBeforeRemark
)。
在jdk1.8使用CMS GC时会出现这个错误,我换了G1 Gc解决了这个问题。
-Xss512k -Xms6g -Xmx6g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=70 -XX:NewRatio=1 -XX:SurvivorRatio=6 -XX:G1ReservePercent=10 -XX:G1HeapRegionSize=32m -XX:ConcGCThreads=6 -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
"Allocation Failure"是GC踢不正确的原因。 这是GC操作的结果。
GC 在没有 space 分配时启动(取决于执行次要或主要 GC 的区域)。 如果 space 足够好,则执行 GC,但如果没有足够的大小,它将失败。 分配失败就是这样的失败之一。 下面的文档有很好的解释 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html