GC日志的生成
通过在应用启动的时候,配置jvm参数来实现GC日志的输出
GC日志参数设置
可以参照这个设置在 catelina.sh中配置,例如我的TEST环境
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -XX:PermSize=256M -XX:MaxPermSize=1024M
-XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=2
-verbose:gc
-Xloggc:/usr/developer/huangForBackUp/testgc.log
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintHeapAtGC
-XX:MaxTenuringThreshold=15
"
-verbose:gc 输出日志
-Xloggc:../logs/gc.log 日志文件的输出路径
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式 基准时间是tomcat的启动时间:609587.773: [GC609587.773: [ParNew: 286262K->12045K(306688K))
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,2019-01-30T16:25:25.454+0800: 203.999: [GC2019-01-30T16:25:25.45)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息,注意是前后都会打印
Heap after GC invocations=42 (full 0):
par new generation total 306688K, used 34048K [0x00000006c7200000, 0x00000006dbec0000, 0x00000006dbec0000)
eden space 272640K, 0% used [0x00000006c7200000, 0x00000006c7200000, 0x00000006d7c40000)
from space 34048K, 100% used [0x00000006d7c40000, 0x00000006d9d80000, 0x00000006d9d80000)
to space 34048K, 0% used [0x00000006d9d80000, 0x00000006d9d80000, 0x00000006dbec0000)
concurrent mark-sweep generation total 1756416K, used 571751K [0x00000006dbec0000, 0x0000000747200000, 0x00000007c0000000)
concurrent-mark-sweep perm gen total 262144K, used 111041K [0x00000007c0000000, 0x00000007d0000000, 0x0000000800000000)
}
{Heap before GC invocations=42 (full 0):
par new generation total 306688K, used 306688K [0x00000006c7200000, 0x00000006dbec0000, 0x00000006dbec0000)
eden space 272640K, 100% used [0x00000006c7200000, 0x00000006d7c40000, 0x00000006d7c40000)
from space 34048K, 100% used [0x00000006d7c40000, 0x00000006d9d80000, 0x00000006d9d80000)
to space 34048K, 0% used [0x00000006d9d80000, 0x00000006d9d80000, 0x00000006dbec0000)
concurrent mark-sweep generation total 1756416K, used 571751K [0x00000006dbec0000, 0x0000000747200000, 0x00000007c0000000)
concurrent-mark-sweep perm gen total 262144K, used 115737K [0x00000007c0000000, 0x00000007d0000000, 0x0000000800000000)
类型概述
- [DefNew 表示用的Serial 年轻代回收器
- [ParNew 表示年轻代用的 Parnew
- [PSYoungGen: 表示年轻代用的是 Parallel Scanvenge
解读YGC的一条日志
- 下面是[ParNew] 表示年轻代回收器,也就是YGC
- 年轻代从306688K(eden+S0)经过YGC后变成了26672K,年轻代的总容量还是306688K,YGC累计系统耗时 0.0505390 secs,整个堆区从YGC前的878439K变成了压缩后的614977K,整个堆区的容量为2063104K(实际上忽略了一个S0区的大小)
- S0区大小34048K, S0 +2063104K=2097152 K= 2G
[GC2019-01-30T16:25:25.454+0800: 203.999: [ParNew: 306688K->26672K(306688K), 0.0505390 secs] 878439K->614977K(2063104K), 0.0507020 secs][Times: user=0.16 sys=0.00, real=0.05 secs]