面試連環炮系列(二十六):什麼情況下JVM頻繁發生full GC
阿新 • • 發佈:2022-03-25
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是程序號
- 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