前言
之前有提到过,GC的垃圾回收机制以及触发情况,虽然这个都是虚拟机默默执行的,不需要我们手动去GC,但是了解GC的原理,有助于我们码出未来;
GC垃圾回收算法
GC常用算法有:
引用计数法,标记-清除算法,复制算法,标记-整理算法,分代收集算法;
HotSpot虚拟机采用的是分代收集算法;
标记-清除 算法
标记-清除算法对根集合进行扫描,对存活的对象进行标记。标记完成后,再对整个空间内未被标记的对象扫描,进行回收;

优势:实现简单,不需要进行对象进行移动
缺点:标记、清除过程效率低,产生大量不连续的内存碎片,提高了垃圾回收的频率
复制算法
这种收集算法解决了标记清除算法存在的效率问题。
它将内存区域对半分开。每次仅使用一半的空间,JVM生成的新对象放在一半空间中。当一半空间用完时进行GC,把可到达对象复制到另一半空间,然后把使用过的内存空间一次清理掉;

优势:按顺序分配内存即可,实现简单、运行高效,不用考虑内存碎片
缺点:可用的内存大小缩小为原来的一半,对象存活率高时会频繁进行复制,而且空间利用率不高
标记-整理算法
标记-整理算法 采用和 标记-清除算法 一样的方式进行对象的标记,但后续不直接对可回收对象进行清理,而是将所有的存活对象往一端空闲空间移动,然后清理掉端边界以外的内存空间

优势:解决了标记-清理算法存在的内存碎片问题
缺点:需要进行局部对象移动,一定程度上降低了效率
分代收集算法
分代收集算法,顾名思义是根据对象的存活周期将内存划分为几块,将堆分为新生代(Young)和老年代(Tenure),新生代又分为一个eden区和两个survivor区;
大部分被新创建的对象会被分配到这里,由于大部分对象在创建后会很快变得不可达,所以很多对象被创建在新生代,然后消失。对象从这个区域消失的过程我们称之为 minor GC;
在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保,所以可以使用标记-整理 或者 标记-清除;

网友评论