1. JVM介紹和運行流程-CSDN博客
2. 什么是程序計數器-CSDN博客
3. java 堆和 JVM 內存結構-CSDN博客
4. 虛擬機棧-CSDN博客
5. JVM 的方法區-CSDN博客
6. JVM直接內存-CSDN博客
7. JVM類加載器與雙親委派模型-CSDN博客
8. JVM類裝載的執行過程-CSDN博客
9. JVM垃圾回收-CSDN博客
10. 垃圾回收的算法-CSDN博客
11. JVM中的分代回收-CSDN博客
12. JVM的垃圾回收器-CSDN博客
13. G1垃圾回收器-CSDN博客
14. 垃圾回收的引用區別-CSDN博客
15. JVM調優的參數設置-CSDN博客
16. JVM調優工具-CSDN博客
1. JVM中的分代回收
分代回收(Generational Collection)是一種基于對象生命周期特性的垃圾回收策略,其核心思想是:大多數對象的生命周期都很短,而存活時間較長的對象通常會繼續存活更長時間。
分代回收的基本原理
-
對象代際劃分:將堆內存劃分為不同代(Generation),通常分為年輕代(Young Generation)和老年代(Old Generation)
-
不同頻率回收:對年輕代進行更頻繁的垃圾回收,而對老年代進行較少頻率的回收
-
晉升機制:存活足夠長時間的年輕代對象會被晉升(Promote)到老年代
2. 分代回收算法
2.1?年輕代回收算法
通常使用復制算法(Copying):
-
內存劃分:年輕代分為Eden區和兩個Survivor區(From和To)
-
分配過程:新對象首先分配在Eden區
-
回收過程:
-
標記存活對象
-
將存活對象復制到一個Survivor區(From→To或To→From)
-
清空Eden和另一個Survivor區
-
交換From和To的角色
-
-
晉升:對象在Survivor區之間經歷一定次數(通常15次)的復制后,晉升到老年代
分配過程圖示:
對于新生代,內部又被分為了三個區域:
- 伊甸園區Eden,新生的對象都分配到這里
- 幸存者區survivor(分成from和to)
- Eden區,from區,to區 8 : 1 : 1
1.?新對象首先分配在Eden區
2.?當伊甸園內存不足,標記伊甸園與from(現階段沒有)的存活對象
?假如咱們在伊甸園區內標記的是 “A對象”,from(現階段沒有)。
3.?將存活對象采用復制算法復制到 to 中,復制完畢后,伊甸園和 from 內存都得到釋放
4.?經過一段時間后伊甸園的內存又出現不足,標記eden區域to區存活的對象,將存活的對象復制到from區
假如伊甸園區咱們標記的 “1對象”,to 區標記?“A對象”。
轉移后如下:
?5.?對象在Survivor區之間經歷一定次數(通常15次)的復制后,晉升到老年代(幸存區內存不足或大對象會導致提前晉升)
假如這次 Eden區存貨的對象是 “w對象”,Survivor區經歷一定次數依舊存活的是 “A對象”。
轉移復制后的結果如下:
2.2 老年代回收算法
通常使用標記-清除-整理算法(Mark-Sweep-Compact):
-
標記階段:標記所有存活對象
-
清除階段:回收未標記的對象空間
-
整理階段:將存活對象向一端移動,減少內存碎片
2.3?跨代引用處理
分代回收需要處理跨代引用問題,通常使用記憶集(Remembered Set)或卡表(Card Table)來記錄從老年代指向年輕代的引用,避免全堆掃描。
3. 問題總結
3.1?說一下JVM中的分代回收?
堆的區域劃分:
- 堆被分為了兩份:新生代和老年代【1:2】
- 對于新生代,內部又被分為了三個區域。Eden區,幸存者區survivor(分成from和to)【8:1:1】
對象回收分代回收策略:
- 新創建的對象,都會先分配到eden區
- 當伊甸園內存不足,標記伊甸園與 from(現階段沒有)的存活對象
- 將存活對象采用復制算法復制到to中,復制完畢后,伊甸園和 from 內存都得到釋放
- 經過一段時間后伊甸園的內存又出現不足,標記eden區域to區存活的對象,將其復制到from區
- 當幸存區對象熬過幾次回收(通常為15次),晉升到老年代(幸存區內存不足或大對象會提前晉升)
3.2?MinorGc、Mixed Gc、FullGc的區別是什么?
- MinorGC【young GC】發生在新生代的垃圾回收,暫停時間短(STW)
- Mixed GC 新生代 +老年代部分區域的垃圾回收,G1 收集器特有
- FullGC:新生代+老年代完整垃圾回收,暫停時間長(STW),應盡力避免
STW(Stop-The-World):暫停所有應用程序線程,等待垃圾回收的完成。