内存管理和垃圾回收机制(三)垃圾收集算法

2018-07-27  本文已影响0人  f1zz

前文知道了哪些对象应该被删除,那么本文就谈谈怎么删除,也就是删除所用的算法。

标记-清除算法

从名字可知算法分为两个阶段,先是标记出所有需要被回收的对象,然后再把这些被标记的对象进行清除。但该算法有两个缺点:标记和清除操作的效率不高;清除以后会产生大量不连续的碎片空间,碎片太多导致以后分配较大对象时,导致内存不足从而提前触发新的一次垃圾收集行为。

复制算法

为了解决效率问题,复制算法将内存分为大小相同的两块,每次只使用其中一块,垃圾收集时,将使用的那一块(假设为A)中存活着的对象复制到另一块(假设为B),然后将使用的块A进行清空,然后使用块B,下一次收集,块B中存活的对象复制给块A,块B清空,如此反复。这种算法也有问题,本来可以使用空间大小被缩小到了一半,代价有点高。

标记-整理算法

与标记-清除算法类似,先是对需要回收的对象进行标记,然后将存活的对象挪到一起,待回收的对象挪到一起,将存活对象之外的空间进行清空。好处是减少了不连续的碎片空间,但标记加上对象挪动,效率依旧不高

分代收集算法

目前商业虚拟机都使用这种算法,这种算法结合了之前的三种算法,但使用更灵活,让之前的算法的缺点不那么明显,首先先来了解下java堆的组成结构

heap.png
上一篇 下一篇

猜你喜欢

热点阅读