常见的回收算法:标记清除算法、复制算法、标记-整理算法、分代收集算法
1、标记清除算法
第一步:标记(找出内存中需要回收的对象,并且把它们标记出来)
第二步:清除 (清除掉被标记需要回收的对象,释放出对应的内存空间)
缺点:
标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
(1)标记和清除两个过程都比较耗时,效率不高
(2)会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
标记过程:
清除过程:
标记清除算法的衍生规则之分配(动态分区分配策略)
首次适应算法(Fisrt-fit)
首次适应算法(Fisrt-fit)就是在遍历空闲链表的时候,一旦发现有大小等于需要的大小之后,就立即把该块分配给对象,并立即返回。
最佳适应算法(Best-fit)
最佳适应算法(Best-fit)就是在遍历空闲链表的时候,返回刚好等于需要大小的块。
最差适应算法(Worst-fit)
最差适应算法(Worst-fit)就是在遍历空闲链表的时候,找出空闲链表中最大的分块,将其分割给申请的对象,其目的就是使得分割后分块的最大化,以便下次好分配,不过这种分配算法很容易产生很多很小的分块,这些分块也不能被使用
2、标记复制算法
流程:
将内存划分为两块相等的区域,每次只使用其中一块。
当其中一块内存使用完了,就将还存活的对象复制到另外一块上面,然后把已经使用过的内存空间一次清除掉。
缺点:
空间利用率降低
标记过程:
复制过程
3、标记整理(压缩)算法
标记整理算法严格意义应该叫做标记清除整理算法或者标记清除压缩算法。
因为他的本质就是在标记清除的基础在进行再整理。
标记过程:
整理过程:
整理(压缩)算法分类:
随机整理
线性整理
滑动整理
随机整理:对象的移动方式和它们初始的对象排列及引用关系无关
线性顺序:将具有关联关系的对象排列在一起
滑动顺序:将对象“滑动”到堆的一端,从而“挤出”垃圾,可以保持对象在堆中原有的顺序
几种典型的整理