Java虛擬機器記憶體分配與回收策略
記憶體分配與回收策略
Minor GC 和 Full GC
-
Minor GC:發生在 新生代 上,因為新生代物件存活時間很短,因此 Minor GC 會頻繁執行, 執行的速度一般也會比較快。
-
Full GC:又稱Major GC,發生在 老年代 上,老年代物件其存活時間長, 因此 Full GC 很少執行,執行速度會比 Minor GC 慢很多。
記憶體分配策略
- 堆記憶體:
- 分配策略:
1. 物件優先在 Eden 分配
大多數情況下,物件在新生代 Eden 區分配,當 Eden 區空間不夠時,發起 Minor GC。
2. 大物件直接進入老年代
大物件是指 需要連續記憶體空間的物件 ,最典型的大物件是那種很長的字串以及陣列。
經常出現大物件會 提前觸發垃圾收 集以獲取足夠的連續空間分配給大物件。
-XX:PretenureSizeThreshold,大於此值的物件直接在老年代分配,避免在 Eden 區和 Survivor 區之間的大量記憶體複製。
3. 長期存活的物件進入老年代
為物件定義年齡計數器,物件在 Eden 出生並經過 Minor GC 依然存活, 將移動到 Survivor 中,年齡就增加 1 歲,增加到一定年齡則移動到老年代中。
-XX:MaxTenuringThreshold 用來定義年齡的閾值。
4. 動態物件年齡判定
虛擬機器並不是永遠地要求物件的年齡必須達到 MaxTenuringThreshold 才能晉升老年代, 如果在 Survivor 中相同年齡所有物件大小的總和大於 Survivor 空間的一半, 則年齡大於或等於該年齡的物件可以直接進入老年代,無需等到 MaxTenuringThreshold 中要求的年齡。
5. 空間分配擔保
在發生 Minor GC 之前,虛擬機器先檢查老年代最大可用的連續空間是否大於新生代所有物件總空間,如果條件成立的話,那麼 Minor GC 可以確認是安全的。
如果不成立的話虛擬機器會檢視 HandlePromotionFailure 設定值是否允許擔保失敗,如果允許那麼就會繼續檢查老年代最大可用的連續空間是否大於歷次晉升到老年代物件的平均大小,如果大於,將嘗試著進行一次 Minor GC;如果小於,或者 HandlePromotionFailure 設定不允許冒險,那麼就要進行一次 Full GC。
Full GC 的觸發條件
對於 Minor GC,其觸發條件非常簡單, 當 Eden 空間滿時,就將觸發一次 Minor GC 。 而 Full GC 則相對複雜,有以下條件:
1. 呼叫 System.gc()
只是建議虛擬機器執行 Full GC,但是虛擬機器不一定真正去執行。不建議使用這種方式,而是讓虛擬機器管理記憶體。
2. 老年代空間不足
老年代空間不足的常見場景為前文所講的大物件直接進入老年代、長期存活的物件進入老年代等。
為了避免以上原因引起的 Full GC,應當儘量不要建立過大的物件以及陣列。 除此之外,可以通過 -Xmn 虛擬機器引數調大新生代的大小,讓物件儘量在新生代被回收掉,不進入老年代。 還可以通過 -XX:MaxTenuringThreshold 調大物件進入老年代的年齡,讓物件在新生代多存活一段時間。
3. 空間分配擔保失敗
使用複製演算法的 Minor GC 需要老年代的記憶體空間作擔保,如果擔保失敗會執行一次 Full GC。 具體內容請參考上面的第五小節。
4. JDK 1.7 及以前的永久代空間不足
在 JDK 1.7 及以前,HotSpot 虛擬機器中的方法區是用永久代實現的, 永久代中存放的為一些 Class 的資訊、常量、靜態變數等資料。
當系統中要載入的類、反射的類和呼叫的方法較多時,永久代可能會被佔滿, 在未配置為採用 CMS GC 的情況下也會執行 Full GC。 如果經過 Full GC 仍然回收不了,那麼虛擬機器會丟擲 java.lang.OutOfMemoryError。
為避免以上原因引起的 Full GC,可採用的方法為增大永久代空間或轉為使用 CMS GC。
5. Concurrent Mode Failure
執行 CMS GC 的過程中同時有物件要放入老年代,而此時老年代空間不足 (可能是 GC 過程中浮動垃圾過多導致暫時性的空間不足), 便會報 Concurrent Mode Failure 錯誤,並觸發 Full GC。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917606/viewspace-2644157/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入理解Java虛擬機器 --- 記憶體分配與回收策略Java虛擬機記憶體
- 詳解Java 虛擬機器(第⑥篇)——記憶體分配與回收策略Java虛擬機記憶體
- 深入理解Java虛擬機器筆記之六記憶體分配與回收策略Java虛擬機筆記記憶體
- Java虛擬機器05——物件分配與回收策略Java虛擬機物件
- 【Java 虛擬機器筆記】記憶體分配策略相關整理Java虛擬機筆記記憶體
- JVM垃圾回收器、記憶體分配與回收策略JVM記憶體
- 深入理解Java虛擬機器-垃圾收集器與記憶體分配策略Java虛擬機記憶體
- 深入學習Java虛擬機器——垃圾收集器與記憶體分配策略Java虛擬機記憶體
- 深入理解Java虛擬機器 - 垃圾收集器與記憶體分配策略Java虛擬機記憶體
- 《深入java虛擬機器》讀書筆記之垃圾收集器與記憶體分配策略Java虛擬機筆記記憶體
- 《深入理解Java虛擬機器》(二)--垃圾收集器與記憶體分配策略(2)Java虛擬機記憶體
- 深入理解JVM虛擬機器-物件引用,GC與記憶體分配回收JVM虛擬機物件GC記憶體
- JVM 之 記憶體分配與回收策略JVM記憶體
- 垃圾收集器與記憶體分配策略_記憶體分配策略記憶體
- 【JVM之記憶體與垃圾回收篇】虛擬機器棧JVM記憶體虛擬機
- JVM垃圾回收和記憶體分配策略JVM記憶體
- JAVA 虛擬機器可用記憶體Java虛擬機記憶體
- Java記憶體區域與分配策略Java記憶體
- Java 虛擬機器之三:Java虛擬機器的記憶體結構Java虛擬機記憶體
- Java虛擬機器:記憶體管理與執行引擎Java虛擬機記憶體
- 垃圾收集器與記憶體分配策略記憶體
- 垃圾收集機制與記憶體分配策略記憶體
- JVM記憶體分配機制與回收策略選擇-JVM學習筆記(2)JVM記憶體筆記
- Java虛擬機器08——Java記憶體模型與執行緒Java虛擬機記憶體模型執行緒
- Java虛擬機器之記憶體區域Java虛擬機記憶體
- JVM 垃圾收集器與記憶體分配策略JVM記憶體
- JVM GC 與 記憶體分配策略JVMGC記憶體
- Java虛擬機器記憶體模型學習筆記Java虛擬機記憶體模型筆記
- 深入理解Java虛擬機器-Java記憶體區域與記憶體溢位異常Java虛擬機記憶體溢位
- JVM記憶體分配策略,及垃圾回收演算法JVM記憶體演算法
- Java虛擬機器記憶體區域劃分Java虛擬機記憶體
- Java虛擬機器記憶體區域詳解Java虛擬機記憶體
- JVM(3)-垃圾收集器與記憶體分配策略JVM記憶體
- JVM-垃圾收集器與記憶體分配策略JVM記憶體
- 垃圾回收與記憶體分配——總結篇記憶體
- 淺談JVM記憶體分配與垃圾回收JVM記憶體
- Java虛擬機器:JVM架構與垃圾回收Java虛擬機JVM架構
- jvm:記憶體模型、記憶體分配及GC垃圾回收機制JVM記憶體模型GC