每日一個知識點:什么時候會觸發Full GC


每日一個知識點系列的目的是針對某一個知識點進行概括性總結,可在一分鍾內完成知識點的閱讀理解。

此處不涉及詳細的原理性解讀,只作為一種拋磚引玉。

真正的理解一定是你自我研究探索所收獲的知識,加入組織帶你一起進步成長。

世界上最快的捷徑,就是腳踏實地。本文已收錄架構技術專欄關注這個喜歡分享的地方,每日獲得一個知識點

1. 調用 System.gc()

只是建議虛擬機執行 Full GC,但是虛擬機不一定真正去執行。不建議使用這種方式,而是讓虛擬機管理內存。

2. 未指定老年代和新生代大小,堆伸縮時會產生fullgc,所以一定要配置-Xmx、-Xms

3. 老年代空間不足

老年代空間不足的常見場景比如大對象、大數組直接進入老年代、長期存活的對象進入老年代等。

為了避免以上原因引起的 Full GC,應當盡量不要創建過大的對象以及數組。

除此之外,可以通過 -Xmn 虛擬機參數調大新生代的大小,讓對象盡量在新生代被回收掉,不進入老年代。

還可以通過 -XX:MaxTenuringThreshold 調大對象進入老年代的年齡,讓對象在新生代多存活一段時間。

在執行Full GC后空間仍然不足,則拋出錯誤:java.lang.OutOfMemoryError: Java heap space

4. JDK 1.7 及以前的(永久代)空間滿

在 JDK 1.7 及以前,HotSpot 虛擬機中的方法區是用永久代實現的,永久代中存放的為一些 Class 的信息、常量、靜

態變量等數據。

當系統中要加載的類、反射的類和調用的方法較多時,永久代可能會被占滿,在未配置為采用 CMS GC 的情況下也

會執行 Full GC。

如果經過 Full GC 仍然回收不了,那么虛擬機會拋出java.lang.OutOfMemoryError PermGen space

為避免以上原因引起的 Full GC,可采用的方法為增大Perm Gen或轉為使用 CMS GC。

5. 空間分配擔保失敗

空間擔保,下面兩種情況是空間擔保失敗:

1、每次晉升的對象的平均大小 > 老年代剩余空間

2、Minor GC后存活的對象超過了老年代剩余空間

注意GC日志中是否有promotion failed和concurrent mode failure兩種狀況,當出現這兩種狀況的時候就有可能會觸發Full GC。

promotion failed 是在進行 Minor GC時候,survivor space空間放不下只能晉升老年代,而此時老年代也空間不足時發生的。

concurrent mode failure 是在進行CMS GC過程,此時有對象要放入老年代而空間不足造成的,這種情況下會退化使用Serial Old收集器變成單線程的,此時是相當的慢的。

怎么調優

圍繞一個點,策略就是盡量把對象在新生代使用回收,減少晉升老年代的幾率

開源項目:


免責聲明!

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



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