GC日志分析

含义

[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日志分析工具有:
GCViewerGCEasy(在线查看GC日志分析结果),还有GCHisto、GCLogViewer、Hpjmeter、garbagecat等。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值