[toc]
既然抉择了远方,即便天寒地冻,路遥马亡,我本就赤贫如洗,又有何惧。
标记革除法
标记革除算法工作分为 2 个阶段。
第一个阶段,先依据 GC Root
标记 可达对象
第二阶段,将不可达对象,间接革除。
算法毛病:会产生大量的内存碎片
工作原理如下图所示:
复制算法
复制算法思维:
- 将内存一分为二,每次只应用其中一块。
- 产生垃圾回收时,将存活的对象复制到另一块未应用的内存
- 清空应用的内存块中的对象,两者角色调换,实现垃圾回收。
复制算法,用于新生代。java
借鉴复制算法,将新生代内存划分为 eden、from、to
。默认比例为 8:1:1
。eden, from
存活的对象会被放入 to
中,eden, from
不可达对象会被清空。清空后,from、to
角色调换
算法前提:新生代对象朝生夕死
工作原理如下图所示:
标记压缩法
标记压缩法思维:
GC Root 可达性剖析
标记可达对象- 将可达对象对立放至内存一端
- 清理边界外的空间
标记压缩不会产生内存碎片
工作原理如下图所示:
分代算法
JVM
将对象分为新生代和老年代。
新生代应用复制算法回收垃圾;老年代应用标记压缩或标记革除回收垃圾。
新生代对象大多朝生夕死,失常来说 ygc
频率高,速度快。如果 老年代对象援用了新生代对象,那么就须要扫描老年代对象 。因而会造成 ygc
效率低下,须要全堆扫描。JVM
引入 卡表 (card table) 数据结构
来解决 老年代对象援用新生代对象,造成 ygc 效率低下 问题。
卡表
JVM
通过卡表,记录老年代指向新生代的援用。
卡表为比特位数组,每个比特位能够用于示意 老年代某一区域中所有对象是否持有新生代援用。0 示意没有持有,1 示意持有。在 GC Root
扫描时,只需扫描卡表位为 1 的老年代空间即可,防止全堆扫描,晋升了 ygc
效率。
分区算法
分区算法将整个堆空间分成间断的不同小区间,每一个小区间独立应用,独立回收。分区算法的益处是,能够管制一次 GC
回收的区间,即管制 GC
回收工夫