轉載:
https://mp.weixin.qq.com/s/VehLNvu502R_XXS_sI4TdA
打印 GC 日志的第一步,就是開啟 GC 打印的參數(shù)了奉狈,也是最基本的參數(shù)
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
打印對象分布
為了分析 GC 時的晉升情況和晉升導致的高暫停师坎,不看對象年齡分布日志怎么行
-XX:+PrintTenuringDistribution
GC 后打印堆數(shù)據(jù)
每次發(fā)生 GC 時,對比一下 GC 前后的堆內(nèi)存情況奉呛,更直觀
-XX:+PrintHeapAtGC
-XX:+PrintHeapAtGC
暫停時間是 GC 最重要的指標,肯定不能少
-XX:+PrintGCApplicationStoppedTime
打印 safepoint 信息
進入STW階段之前夯尽,需要要找到一個合適的 safepoint 瞧壮,這個指標一樣很重要(非必選,出現(xiàn) GC 問題時最好加上此參數(shù)調(diào)試)
-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1
打印 Reference 處理信息
強引用/弱引用/軟引用/虛引用/finalize 方法萬一有問題匙握,不得打印出來看看咆槽?
-XX:+PrintReferenceGC
輸出方式
上面只是定義了打印的內(nèi)容,默認情況下圈纺,這些日志會輸出到控制臺(標準輸出)秦忿。那如果你的程序日志也輸出到控制臺呢,這個日志內(nèi)容就會很亂蛾娶,分析起來很麻煩灯谣。如果你是追加的方式(比如 tomcat 的 catalina.out 就是追加),這個文件會越來越大蛔琅,分析起來就要命了胎许。
所以需要一種分割日志的機制,這個機制嘛……JVM自然是提供的揍愁。
JVM提供了幾個用于分割 GC 日志的參數(shù)
# GC日志輸出的文件路徑
-Xloggc:/path/to/gc.log
# 開啟日志文件分割
-XX:+UseGCLogFileRotation
# 最多分割幾個文件呐萨,超過之后從頭開始寫
-XX:NumberOfGCLogFiles=14
# 每個文件上限大小,超過就觸發(fā)分割
-XX:GCLogFileSize=100M
最佳實踐 - 完整參數(shù)
# 必備
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintTenuringDistribution
-XX:+PrintHeapAtGC
-XX:+PrintReferenceGC
-XX:+PrintGCApplicationStoppedTime
# 可選
-XX:+PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount=1
# GC日志輸出的文件路徑
-Xloggc:/path/to/gc-%t.log
# 開啟日志文件分割
-XX:+UseGCLogFileRotation
# 最多分割幾個文件莽囤,超過之后從頭文件開始寫
-XX:NumberOfGCLogFiles=14
# 每個文件上限大小谬擦,超過就觸發(fā)分割
-XX:GCLogFileSize=100M