垃圾收集算法
Mark-Sweep(标记-清除算法)
- 标记清除算法分为两个阶段,标记阶段和清除阶段。标记阶段任务是标记出所有需要回收的对象,清除阶段就是清除被标记对象的空间。
- 优缺点:实现简单,容易产生内存碎片。因为会存在大量的空间碎片,因为回收后的空间是不连续的,这样给大对象分配内存的时候可能会提前触发full gc。
标记-压缩算法
- 首先也需要从根节点开始对所有可达对象做一次标记,但之后,它并不简单地清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。这种方法既避免了碎片的产生,又不需要两块相同的内存空间,因此,其性价比比较高。
- 标记-压缩算法是一种老年代的回收算法,它在标记-清除算法的基础上做了一些优化。
- 优缺点:不容易产生内存碎片;内存利用率高;存活对象多并且分散的时候,移动次数多,效率低下
复制算法
- 将现有的内存空间分为两快,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。
- 优缺点:不容易产生内存碎片;可用内存空间少;存活对象多的话,效率低下。
分代收集算法
- 当前商业虚拟机的垃圾收集都采用“分代收集”算法,该算法根据对象存活周期的不同,将内存划分为几块。一般把java堆划分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的算法。
- 在新生代中,每次垃圾收集都发现有大批对象死去,只有少量存活,那就采用复制法,只需要付出少量存活对象的复制成本就可以完成收集
- 而老年代中对象存活率高,没有额外空间对它进行分配担保,就必须采用“标记-清除”算法或“标记-整理”算法来进行回收。