每日一個知識點系列的目的是針對某一個知識點進行概括性總結,可在一分鍾內完成知識點的閱讀理解。
此處不涉及詳細的原理性解讀,只作為一種拋磚引玉。
真正的理解一定是你自我研究探索所收獲的知識,加入組織帶你一起進步成長。
世界上最快的捷徑,就是腳踏實地。本文已收錄架構技術專欄關注這個喜歡分享的地方,每日獲得一個知識點
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收集器變成單線程的,此時是相當的慢的。
怎么調優
圍繞一個點,策略就是盡量把對象在新生代使用回收,減少晉升老年代的幾率
開源項目:
-
分布式監控(Gitee GVP最有價值開源項目 ):https://gitee.com/sanjiankethree/cubic
-
Github 文章收錄:https://github.com/qianglu1989/technology