1.問題描述
線上出現fullgc報警,每5分鐘一次
2.背景知識
1. 程序執行了System.gc()
- 執行了jmap -histo:live pid命令
- 在執行minor gc的時候進行的一系列檢查
執行Minor GC的時候,JVM會檢查老年代中最大連續可用空間是否大于了當前新生代所有對象的總大小。 如果大于,則直接執行Minor GC(這個時候執行是沒有風險的)。 如果小于了,JVM會檢查是否開啟了空間分配擔保機制,如果沒有開啟則直接改為執行Full GC。 如果開啟了,則JVM會檢查老年代中最大連續可用空間是否大于了歷次晉升到老年代中的平均大小,如果小于則執行改為執行Full GC。 如果大于則會執行Minor GC,如果Minor GC執行失敗則會執行Full GC - 使用了大對象
- 在程序中長期持有了對象的引用
3.排查步驟
注意: JVM在執行dump操作的時候是會發生stop the word事件的,也就是說此時所有的用戶線程都會暫停運行。
3.1通過JVM參數獲取dump文件
# 1.線上環境如果有流量需要在啟動服務腳本中加入如下JVM參數,表示在發生fullgc的時候自動dump
-XX:HeapDumpBeforeFullGC
# 2.與第一個JVM參數配套使用,指定dump文件的保存路徑,便于排查問題,路徑也可以是相對路徑
-XX:HeapDumpPath=保存dump文件的文件絕對路徑# 說明:如果加入這兩個jvm參數還是沒有dump下來文件,可能是你的jvm的參數中有其他的參數導致dump失敗,排查看是否有如下參數,如果有去掉即可
-XX:+DisableExplicitGC
3.2通過JDK自帶的工具jmap獲取dump文件
# 導出內存dump文件
jmap -F -dump:live,file=jmap.hprof [PID] ##### 3.3把dump文件從線上主機下載到本地
命令格式:
scp local_file remote_username@remote_ip:remote_folder
或者
scp local_file remote_username@remote_ip:remote_file
或者
scp local_file remote_ip:remote_folder
或者
scp local_file remote_ip:remote_file##### 3.4通過JDK自帶的jvisualvm工具分析或者下載三方軟件jprofiler來分析dump文件即可##### 3.5最重要的一點,要把fullgc發生時刻的dump文件和正常沒有發生fullgc時間的dump文件都下載到本地,然后對比觀察分析方便找到問題的原因