1. 程式人生 > 其它 >面試連環炮系列(二十六):什麼情況下JVM頻繁發生full GC

面試連環炮系列(二十六):什麼情況下JVM頻繁發生full 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?
  1. top命令檢視CPU的佔用情況
    top命令獲得應用程式的程序ID,Java程式的“COMMOND”列是"java"
  2. jstat命令檢視GC的統計
jstat -gc 3038 #3038是程序號
  1. jstat命令檢視GC的情況
jstat -gc 3038 #3038是程序號
  1. jmap命令生成堆疊檔案
jmap -F -dump:format=b,file=heapDump 3038 #3038是程序號
  1. 下載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