面試連環炮系列(二十六):什么情況下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. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM