什麼情況下JVM頻繁發生full GC; 在實際項目什麼代碼導致full GC;線上怎麼排查是哪個程式導致的ful GC ...
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
公眾號:編碼磚家
出處:https://www.cnblogs.com/xiaoyangjia/
本文版權歸作者所有,任何人或團體、機構全部轉載或者部分轉載、摘錄,請在文章明顯位置註明作者和原文鏈接。