垃圾收集算法

垃圾收集算法有很多种,有的是单独的算法,有的是多个算法的组合,这里谈的算法来自《深入Java虚拟机》一书:

引用计数:
这是一个比较古老的算法,原理和C++中的SmartPointer差不多,堆中的每个对象都有一个引用计数,创建一个对象之后,每有一个引用指向对象,该对象的引用计数被加1.当引用对象的引用计数为0时,对象变可以被垃圾收集。
这种方式虽然比较快,但是不能收集循环引用的对象。

跟踪收集:
将堆中的对象比作一个有多个树的森林,收集器启动时,从每棵树的跟节点开始向下追踪,并为每个遇到的对象做个标记,当追踪结束时,没有被标记的对象变可以作为垃圾收集。

这种收集算法是组合算法,一般会使用压缩和拷贝算法

压缩收集:
该收集策略主要是应对堆中的碎块。也就是在收集的过程中将堆中的碎片合并成为大的块。

拷贝收集:
该收集把所有的活动对象拷贝移动到一个新的区域。
好处是在追踪活动对象时,发现活动的就可以直接拷贝到新的区域,而不再用标记和清除,但是对于大的对象,频繁的拷贝会有效率问题,并且在拷贝期间,程序的执行一般要终止。

按代收集:
将堆中的对象按照生命周期的长短分为不同的“代”,对于不同的“代”,采取不同的收集算法。目前Java中的收集算法采用的都是按代收集算法。

自适应收集算法:
就是算法根据堆中的情形,相应的调整为合适的垃圾收集算法。太智能了,不知道有没有这样的算法。

火车算法:
目前的算法都是需要将程序停顿,并且无法控制何时停顿以及停顿的时间,也无法满足实时系统的要求,这种算法被称为破坏性的算法。为了达到非破坏性的收集方法是使用渐进式收集。渐进式收集不是试图一次性发现并回收所有不可达的对象,而是每次回收一部分,这样可以减少停顿的时间。

你可能感兴趣的:(算法,虚拟机,活动)