前言
GC 垃圾回收有中算法,
- 标记
- 复制
- 标记清除
- 标记压缩
每种算法各有利弊,JVM 垃圾回收使用分代算法,不同年龄带使用不同算法
- 年轻代:频繁发生GC,偶尔FGC
- 老年代:Full GC,频率较低
标记
特点
每个对象都有一个引用计数器,每当对象被引用一次,计数器就+1,如果引用失效,则计数器-1,如果为0,则GC可以清理;
缺点
计数器维护麻烦!
循环引用无法处理!
A、D 、F属于有效引用, B和G相互引用,无效引用,导致无法回收
复制算法
把原始数据复制一份,JVM年轻代使用是复制算法。
年轻代GC后存活的对象,从Eden 和 From 区复制到 To 区。完成后,Fom 与To交换位置,To 又空了。经历一次GC后年龄+1,年轻代中经过15 GC后,仍然活着对像升级进入老年代
优点:没有标记和清除的过程!效率高!没有内存碎片!
缺点:需要浪费双倍的空间
标记清除算法
老年代使用,和标记压缩一起使用,节省空间
优点:与复制比不需要额外空间
缺点:两次扫描,产生空间碎片
标记压缩
比标记清除多了一步,内存压缩
没有内存碎片!但是耗时可能也较为严重