JVM 內存結構
JVM 體系概述
Java8 以後的 JVM
GC 的作用域
常見的垃圾回收算法
引用計數
複製
Java 堆從 GC 的角度還可以細化爲:新生代(Eden區、From Survivor區和To Survivor區)和老年代。
1:eden、SurvivorFrom 複製到 SurvivorTo,年齡 +1
首先,當Eden區滿的時候會觸發第一次GC,把還活着的對象拷貝到SurvivorFrom區,當Eden區再次觸發GC的時候會掃描Eden區和From區域,對這兩個區域進行垃圾回收,經過這次回收後還存活的對象,則直接複製到To區域(如果有對象的年齡已經達到了老年的標準,則賦值到老年代區),同時把這些對象的年齡+1
2:清空 eden、SurvivorFrom
然後,清空 Eden 和 SurvivorFrom 中的對象,也即複製之後有交換,誰空誰是 to
3:SurvivorTo 和 SurvivorFrom 互換
最後,SurvivorTo 和 SurvivorFrom 互換,原 SurvivorTo 成爲下一次 GC 時的 SurvivorFrom 區。部分對象會在From和To區域中複製來複制去,如此交換15次(由JVM參數MaxTenuringThreshold決定,這個參數默認是15),最終如果還是存活,就存入老年代
標記清除
垃圾收集算法——標記清除法(Mark-Sweep)
算法分成標記和清除兩個階段,先標記出要回收的對象,然後統一回收這些對象。形如:
標記整理
標記-壓縮(Mark-Compact)