垃圾回收算法
标记-清除算法
清除:并不是真正的置空,下次有新对象时,判断垃圾空间是否够,不够则覆盖
优点:易于理解
缺点:效率低 清理出的空闲内存不连续 需一个列表记录垃圾对象地址
复制算法
解决标记清除算法的缺陷,内存分两块,每次只使用一块,回收时将正在使用的复制到未被使用的 清除使用内存中的所有
优点:实现简单 效率高
缺点:需两倍的内存空间
应用:新生代的S1和S2
标记-压缩
压缩:将存货对象压缩到内存的一端,按顺序排放
优点:不会产生内存碎片
缺点:效率<复制算法(效率低)
分代:不同区域使用不同的垃圾回收算法
新生代:幸存者1 ··· 幸存者2
老年代:标记压缩,标记清除,混合实现
增量收集和分区算法:
垃圾回收时,用户线程要停止(STW)
再次回收部分垃圾,回收线程和用户线程交替执行,减少用户停顿时间
缺点:切换效率开销大,每次回收垃圾少
对象引用
强引用:
强引用不会被回收,即使内存不够用 报OOM 也不会回收
软引用:
使用SoftReference进行标记
垃圾回收后,内存不够用,会回收软引用
若弱引用回收后,内存不够用,报OOM
弱引用:
使用WeakReference进行标记
下一次垃圾回收时无论内存是否足够都会被回收
虚引用:
幽灵引用,幻影引用 所有引用类型中最弱的
使用PhantomReference标记 相当于没有引用,随时可被回收
垃圾回收器
CMS回收器(追求低延迟)
回收时,用户线程,GC线程并发执行
追求低停顿
优点:并发收集,低延迟
缺点:产生内存碎片
并发时占用用户线程,同时执行,吞吐量下降
G1(区域分代式)分区垃圾收集
JDK7之后引入的新的回收器
并行回收器,把堆内存分割成很多区域,回收的避免整堆回收
保证低延迟,提高吞吐量