[TOC]
1、如何收集GC日志
1.1、 配置JVM啟動(dòng)參數(shù):
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<file-path>
示例:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/opt/app/gc.log
1.2、 GC相關(guān)啟動(dòng)參數(shù)說(shuō)明
1.2.1、簡(jiǎn)單日志模式
-XX:+PrintGC 或者 -verbose:gc
日志輸出示例:
[GC 246656K->243120K(376320K), 0,0929090 secs]
[Full GC 243120K->241951K(629760K), 1,5589690 secs]
1.2.2、詳細(xì)日志格式
-XX:+PrintGCDetails
日志輸出示例:
[GC [PSYoungGen: 142816K->10752K(142848K)] 246648K->243136K(375296K), 0,0935090 secs] [Times: user=0,55 sys=0,10, real=0,09 secs]
[Full GC [PSYoungGen: 10752K->9707K(142848K)] [ParOldGen: 232384K->232244K(485888K)] 243136K->241951K(628736K) [PSPermGen: 3162K->3161K(21504K)], 1,5265450 secs] [Times: user=10,96 sys=0,06, real=1,53 secs]
1.2.3、日志中添加時(shí)間標(biāo)志(日志每行開頭顯示自從JVM啟動(dòng)以來(lái)的時(shí)間,?????????單位為秒)
-XX:+PrintGCTimeStamps
日志輸出示例:
0,185: [GC 66048K->53077K(251392K), 0,0977580 secs]
0,323: [GC 119125K->114661K(317440K), 0,1448850 secs]
1.2.4、日志中添加日期標(biāo)志(日志每行開頭顯示絕日期及時(shí)間,?????????單位為秒)
-XX:+PrintGCDateStamps
日志輸出示例:
2014-01-03T12:08:38.102-0100: [GC 66048K->53077K(251392K), 0,0959470 secs]
2014-01-03T12:08:38.239-0100: [GC 119125K->114661K(317440K), 0,1421720 secs]
1.2.5、 打印GC前后的詳細(xì)堆棧信息
-XX:+PrintHeapAtGC
日志輸出示例:
Heap after GC invocations=1 (full 0):
par new generation total 943744K, used 54474K [0x0000000757000000, 0x0000000797000000, 0x0000000797000000)
eden space 838912K, 0% used [0x0000000757000000, 0x0000000757000000, 0x000000078a340000)
from space 104832K, 51% used [0x00000007909a0000, 0x0000000793ed2ae0, 0x0000000797000000)
to space 104832K, 0% used [0x000000078a340000, 0x000000078a340000, 0x00000007909a0000)
concurrent mark-sweep generation total 1560576K, used 0K [0x0000000797000000, 0x00000007f6400000, 0x00000007f6400000)
concurrent-mark-sweep perm gen total 159744K, used 38069K [0x00000007f6400000, 0x0000000800000000, 0x0000000800000000)
}
1.2.6、查看每次minor GC后新的存活周期的閾值
-XX:+PrintTenuringDistribution
日志輸出示例:
Desired survivor size 53673984 bytes, new threshold 4 (max 6)
- age 1: 9165552 bytes, 9165552 total
- age 2: 2493880 bytes, 11659432 total
- age 3: 6817176 bytes, 18476608 total
- age 4: 36258736 bytes, 54735344 total
: 899459K->74786K(943744K), 0.0654030 secs] 1225769K->401096K(2504320K), 0.0657530 secs] [Times: user=0.55 sys=0.00, real=0.07 secs]
2、GC文件格式說(shuō)明
2.1、 GC文件圖解
Java GC文件圖解
2.2、GC文件格式詳解
2014-11-18T16:39:37.728-0800: 88.808: [Full GC [PSYoungGen: 116544K->12164K(233024K)] [PSOldGen: 684832K->699071K(699072K)] 801376K->711236K(932096K) [PSPermGen: 2379K->2379K(21248K)], 3.4230220 secs] [Times: user=3.40 sys=0.02, real=3.42 secs]
每部分說(shuō)明如下:
2014-11-18T16:39:37.728-0800 – GC運(yùn)行的絕對(duì)時(shí)間.
Full GC – GC類型,可以是‘Full GC’ 或 ‘GC’。
[PSYoungGen: 116544K->12164K(233024K)] – 運(yùn)行新生代GC后,新生代空間從116544k 減少到 12164k 。 總計(jì)分配的新生代空間為233024k。
[PSOldGen: 684832K->699071K(699072K)] – 運(yùn)行年老代GC后, 年老代空間從 684832k 減少到 699071k 。 總計(jì)分配的年老代空間為669072k。
801376K->711236K(932096K) – 運(yùn)行GC后, 整個(gè)內(nèi)存空間從 801376k 減少到 711236k 。 總計(jì)分配的內(nèi)存空間 932096k。
[PSPermGen: 2379K->2379K(21248K)] – 運(yùn)行GC后, 持久代空間從 2379K 減少到 2379K 。 沒(méi)有回收持久代空間。
3.4230220 secs – 此次GC運(yùn)行了3.42秒。
[Times: user=3.40 sys=0.02, real=3.42 secs] –
Real - 是調(diào)用從開始到結(jié)束的實(shí)際持續(xù)時(shí)間。 這是所有持續(xù)的時(shí)間,包括其他進(jìn)程消耗的時(shí)間片和進(jìn)程花費(fèi)在阻塞等待(比如等待I/O完成)上的時(shí)間。
User - 是進(jìn)程用戶模式(user-mode)代碼(非內(nèi)核模式)消耗的CPU時(shí)間。這只是運(yùn)行這個(gè)進(jìn)程所消耗的CPU時(shí)間。其他進(jìn)程及進(jìn)程花費(fèi)在阻塞等待上的時(shí)間不包括在內(nèi)。
Sys - 是進(jìn)程內(nèi)核模式(執(zhí)行內(nèi)核代碼)消耗的CPU時(shí)間。 只包括內(nèi)核中系統(tǒng)調(diào)用消耗的CPU時(shí)間,不包括執(zhí)行庫(kù)代碼(library code)的時(shí)間。和 'user' 一樣,只統(tǒng)計(jì)這個(gè)進(jìn)程自己消耗的時(shí)間。
User+Sys 告訴你你的進(jìn)程實(shí)際消耗的CPU時(shí)間。注意這個(gè)時(shí)間是所有CPUs時(shí)間總和,所以如果進(jìn)程是多線程執(zhí)行,那么 User+Sys 可能大于 Real 。
并行GC示例:
[Times: user=11.53 sys=1.38, real=1.03 secs]
串行GC示例:
[Times: user=0.09 sys=0.00, real=0.09 secs]
3、GC分析工具
3.1、在線GC分析
4、參考資料
https://dzone.com/articles/understanding-garbage-collection-log
https://blog.tier1app.com/2016/04/06/gc-logging-user-sys-real-which-time-to-use/
https://blog.codecentric.de/en/2014/01/useful-jvm-flags-part-8-gc-logging/
http://www.codeceo.com/article/twitter-jvm-performance.html#0-tsina-1-26634-397232819ff9a47a7b7e80a40613cfe1
http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
http://darktea.github.io/notes/2013/09/08/java-gc.html