含义
[GC (Allocation Failure) [PSYoungGen: 1531K->488K(2048K)] 1531K->672K(7680K), 0.0009789 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Allocation Failure) [PSYoungGen: 504K->0K(2048K)] [ParOldGen: 248K->618K(5632K)] 752K->618K(7680K), [Metaspace: 3141K->3141K(1056768K)], 0.0054357 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
开头的 [GC
[Full GC
表明垃圾收集的停顿类型,带 Full
说明此次GC发生了Stop The World。
接下来的 [PSYoungGen
、[ParNew
、[DefNew
表示GC发生的区域,分别表示使用了 Parallel Scavenge 收集器、 Parallel New 收集器、 Serial 收集器
Allocation Failure
年轻代空间不足,分配失败
[PSYoungGen: 1531K->488K(2048K)] 1531K->672K(7680K), 0.0009789 secs
中括号内:回收前年轻代大小->回收后年轻代大小(年轻代总大小)
中括号外:回收前堆大小->回收后堆大小(堆总大小)
user=0.00 sys=0.00, real=0.00 secs
user:用户态回收耗时,sys内核态回收耗时,real实际垃圾回收所花费时间。多核条件下,user时间(多个线程使用CPU时间之和)会大于real时间。
例子分析
在JDK8环境,以 -Xms20m -Xmx20m -Xmn10m -XX:+UseSerialGC -XX:+PrintGCDetails
参数运行以下代码
public void allocation() {
byte[] allocation1 = new byte[2 * 1024 * 1024]; // 2M
byte[] allocation2 = new byte[2 * 1024 * 1024]; // 2M
byte[] allocation3 = new byte[2 * 1024 * 1024]; // 2M
byte[] allocation4 = new byte[4 * 1024 * 1024]; // 4M
}
结果分析
- 分配最后的4M时Eden区没有空间了导致一次YoungGC,又因为年轻代的存活的6M数据无法放入Survivor区,则直接移入老年代,再在Eden区分配4M内存
- 由于大对象(不含任何引用的超长数组)可直接进入老年代,无需进行GC,因此如果我们加上参数
-XX:PretenureSizeThreshold=4m
时(PretenureSizeThreshold默认为0,此时所有小于Eden区空间的对象,都需先在Eden区分配,大于等于Eden区空间的对象直接进入老年代),分配大于等于4M大小的对象都会直接进入老年代
[GC (Allocation Failure) [DefNew: 8126K->628K(9216K), 0.0050026 secs] 8126K->6772K(19456K), 0.0050482 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 9216K, used 4807K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
eden space 8192K, 51% used [0x00000000fec00000, 0x00000000ff014930, 0x00000000ff400000)
from space 1024K, 61% used [0x00000000ff500000, 0x00000000ff59d2d8, 0x00000000ff600000)
to space 1024K, 0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)
tenured generation total 10240K, used 6144K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
the space 10240K, 60% used [0x00000000ff600000, 0x00000000ffc00030, 0x00000000ffc00200, 0x0000000100000000)
Metaspace used 3234K, capacity 4500K, committed 4864K, reserved 1056768K
class space used 350K, capacity 388K, committed 512K, reserved 1048576K
GC日志分析工具
我们线上实际的GC日志会很大,没法肉眼去分析,就需要用到GC日志分析工具来协助分析。
导出GC日志的参数:-Xloggc:./logs/gc.log
常用的GC日志分析工具有:
GCViewer、GCEasy(在线查看GC日志分析结果),还有GCHisto、GCLogViewer、Hpjmeter、garbagecat等。