1. 什么情況下JVM頻繁發生full GC?
full gc觸發條件是老年代空間不足,具體原因有四個:
- 系統並發高、執行耗時長或者創建對象過多,導致 young gc頻繁,且gc后存活對象太多,但是survivor 區存放不下(太小或動態年齡判斷) 導致對象快速進入老年代,造成full gc。
- 過多的大對象載入到內存,新生代空間不足會轉入老年代,導致full gc。
- 發生內存溢出,老年代駐留了大量釋放不掉的對象,只要有一點點對象進入老年代就達到 full gc的水位。
- 頻繁的手動調用System.gc()。
2. 在實際項目什么代碼導致full GC?
- 創建對象過大或過多,比如處理圖片、緩存數據。
- IO資源沒有釋放,比如網絡請求沒有關閉。
3. 線上怎么排查是哪個程序導致的full GC?
- top命令查看CPU的占用情況
top命令獲得應用程序的進程ID,Java程序的“COMMOND”列是"java" - jstat命令查看GC的統計
jstat -gc 3038 #3038是進程號
- jmap命令生成堆棧文件
jmap -F -dump:format=b,file=heapDump 3038 #3038是進程號
- 下載heapDump文件,通過http://gceasy.io/網站或者VisualVM分析堆棧文件,觀察Classes最多的一列是哪個代碼導致的。
參考(摘抄的文字版權屬於原作者):
https://www.cnblogs.com/mushishi/p/14553105.html
https://www.cnblogs.com/wujf/p/10972234.html
https://blog.csdn.net/soaring0121/article/details/83620480