JVM 和 GC 的基礎知識

JVM 內存結構

JVM 體系概述

在這裏插入圖片描述

Java8 以後的 JVM

在這裏插入圖片描述
在這裏插入圖片描述

GC 的作用域

在這裏插入圖片描述

常見的垃圾回收算法

引用計數

在這裏插入圖片描述

複製

Java 堆從 GC 的角度還可以細化爲:新生代(Eden區、From Survivor區和To Survivor區)和老年代
在這裏插入圖片描述

MinorGC 的過程(複製 -> 清空 -> 互換)

1:edenSurvivorFrom 複製到 SurvivorTo,年齡 +1
首先,當Eden區滿的時候會觸發第一次GC,把還活着的對象拷貝到SurvivorFrom區,當Eden區再次觸發GC的時候會掃描Eden區和From區域,對這兩個區域進行垃圾回收,經過這次回收後還存活的對象,則直接複製到To區域(如果有對象的年齡已經達到了老年的標準,則賦值到老年代區),同時把這些對象的年齡+1

2:清空 edenSurvivorFrom
然後,清空 Eden 和 SurvivorFrom 中的對象,也即複製之後有交換,誰空誰是 to

3:SurvivorToSurvivorFrom 互換
最後,SurvivorTo 和 SurvivorFrom 互換,原 SurvivorTo 成爲下一次 GC 時的 SurvivorFrom 區。部分對象會在From和To區域中複製來複制去,如此交換15次(由JVM參數MaxTenuringThreshold決定,這個參數默認是15),最終如果還是存活,就存入老年代

標記清除

垃圾收集算法——標記清除法(Mark-Sweep)
算法分成標記和清除兩個階段,先標記出要回收的對象,然後統一回收這些對象。形如:
在這裏插入圖片描述

標記整理

標記-壓縮(Mark-Compact)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章