Java GC(分配失败)

为什么总是“GC(分配失败)”?

适用于linux-amd64 JRE( 1.8.0_25 -b17)的Java HotSpot(TM)64位服务器VM(25.25-b02),

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] 

“分配失败”是GC循环踢的原因。

“分配失败”意味着Eden没有更多的空间来分配对象。 所以,这是年轻GC的正常原因。

较老的JVM没有打印GC,导致次要GC循环。

“分配失败”几乎只是小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