如題,機器發生頻繁FullGC報警,如何定位原因?
一般現象爲CPU飆高,RT增加,另外很可能出現OOM。當碰到這種現象時,如何定位:
Jmap
打印heap的概要信息,GC使用的算法,heap(堆)的配置及JVM堆內存的使用情況.
jmap -heap pid
打印每個class的實例數目,內存佔用,類全名信息,VM的內部類名字開頭會加上前綴”*”. 如果live子參數加上後,只統計活的對象數量.
jmap -histo:live pid
輸出jvm的heap內容到文件,live子選項是可選的,假如指定live選項,那麼只輸出活的對象到文件.
jmap -dump:live,format=b,file=myjmapfile.txt pid
finalizerinfo 打印正等候回收的對象的信息
jmap -finalizerinfo pid
arthas
查看當前的jvm進程堆內存狀態
dashboard
watch系統中某個方法,某個屬性的值,嚴重對象當前狀態。
# watch 類全路徑 方法名 '屬性或者方法的全路徑引用'
watch demo.MathGame primeFactors 'target.illegalArgumentCount'
# 觀察方法的第一個參數值
watch demo.MathGame primeFactors params[0]
jmap文件分析
自帶的命令分析
jhat <heap-dump-file>
jvisuvm裝入,裝入時記得選hprof,有幾個不同選項,apps,hprof
建議
- 代碼中使用無界隊列,如LinkedBlockingQuene一定要注意,最好設置長度限制
- ThreadLocal用完記得remove對象