每日一個知識點:什麼時候會觸發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收集器變成單執行緒的,此時是相當的慢的。
怎麼調優
圍繞一個點,策略就是儘量把物件在新生代使用回收,減少晉升老年代的機率
開源專案:
-
分散式監控(Gitee GVP最有價值開源專案 ):https://gitee.com/sanjiankethree/cubic
-
攝像頭視訊流採集:https://gitee.com/sanjiankethree/cubic-video
-
Github 文章收錄:https://github.com/qianglu1989/technology
相關文章
- 總結Minor GC、Full GC觸發條件GC
- jvm hotspot的minor major full gc之間的關係,以及哪些情況下會觸發full gcJVMHotSpotGC
- mysql什麼時候會發生file sortMySql
- 觸發JVM進行Full GC的情況及應對策略JVMGC
- GC(Allocation Failure)引發的一些JVM知識點梳理GCAIJVM
- Full GC (Metadata GC Threshold)GC
- shiro 什麼時候會進入 doGetAuthorizationInfo() ?
- Android一個小知識點: 多個介面同時使用一個資源佈局的時候,修改背景需要注意的坑Android
- 當我談自律的時候,我會談什麼(一)
- 什麼時候會傳送options請求
- MySQL什麼時候會使用內部臨時表?MySql
- JVM 系列文章之 Full GC 和 Minor GCJVMGC
- C++中什麼時候用move,什麼時候用forward?C++Forward
- 每日一個知識點:Volatile 和 CAS 的弊端之匯流排風暴
- SAP CRM中介軟體下載時,為什麼有時候會生成一個奇怪的BDOC容器
- 前端er,什麼時候,你想寫一個 HTTP 伺服器?前端HTTP伺服器
- 什麼時候需要自動化什麼時候用自動化?
- GC是什麼?為什麼要有GC?GC
- OneThink什麼時候會有基於thinkphp5開發的啊?PHP
- 為什麼CRM Opportunity的刪除會觸發一個通向BW系統的RFCUnity
- Python會在什麼時候被其他語言取代Python
- 什麼時候釋出
- 什麼時候能解脫
- Vue常考知識點--extend 能做什麼Vue
- 關於range的一個知識點
- 研發知識:MDD、MDF是什麼?
- 什麼時候採用socket通訊,什麼時候採用http通訊HTTP
- 你是什麼時候”突然”學會程式設計的程式設計
- 請問什麼時候物件分配會不在 TLAB 內分配物件
- 【知識分享】web伺服器是什麼有什麼特點Web伺服器
- 當你在 Linux 上啟動一個程式時會發生什麼?Linux
- 什麼時候該用vuex?Vue
- beego 什麼時候支援grpcGoRPC
- 新版什麼時候釋出?
- 到底什麼時候使用mqMQ
- python什麼時候縮排Python
- 什麼是知識
- Python知識點(一)Python