Java的垃圾收集算法

1. 标记-清除算法

算法分为标记 清除两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收掉所有标记的对象。

缺点

  • 效率问题:标记和清除过程的效率都不高。
  • 空间问题:标记清除后会产生大量的不连续的内存碎片,空间碎片太多会导致在分配较大对象时无法找到足够的连续内存而触发垃圾收集动作。

2. 复制算法

将内存按容量划分为大小相等的两块,每次只使用其中的一块。当其中一块使用完了,将还存活的对象复制到另一块内存上,然后对当前内存块进行一次清理。

优点:每次都是对其中一块内存进行垃圾回收,内存分配不用考虑内存碎片问题,只需要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。
缺点:内存缩小为原来的一半,代价太高了一点。

3. 标记-整理算法

首先标记出所有需要清理的对象,然后让所有存活的对象向一端移动,然后清理掉边界以外的内存。

4. 分代收集算法

根据对象的存活周期不同,将内存划分成几块,针对对应内存块对象存活周期采用最合适的算法。
如新生代中,每次垃圾收集时都会发现大批对象死去,只有少量存活,就选用复制算法。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记-清除标记-整理算法来进行回收。

你可能感兴趣的:(Java的垃圾收集算法)