深入java虚拟机 - 垃圾收集 - 火车算法

时间:2022-12-27 19:07:47

主要看《深入java虚拟机第二版》这本书。 

下面转自http://blog.csdn.net/zouxinfox/article/details/1594216


       垃圾收集算法一个很大的缺点就是难以控制垃圾回收所占用的CPU时间,以及何时需要进行垃圾回收。火车算法是分代收集器所用的算法,目的是在成熟对象空间中提供限定时间的渐进收集。目前应用于SUN公司的Hotspot虚拟机上。

       在火车算法中,内存被分为块,多个块组成一个集合。为了形象化,一节车厢代表一个块,一列火车代表一个集合,见图一

深入java虚拟机 - 垃圾收集 - 火车算法

图一

注意每个车厢大小相等,但每个火车包含的车厢数不一定相等。垃圾收集以车厢为单位,收集顺序依次为1.11.21.31.42.12.22.33.13.23.3。这个顺序也是块被创建的先后顺序。

垃圾收集器先从块1.1开始扫描直到1.4,如果火车1四个块中的所有对象没有被火车2和火车3的对象引用,而只有火车1内部的对象相互引用,则整个火车1都是垃圾,可以被回收。

图二,车厢1.1中有对象A和对象B1.3中有对象C1.4中有对象D车厢2.2中有对象E,车厢3.3中有对象F。在火车1中,对象C引用对象A,对象B引用对象D,可见,火车2和火车3没有引用火车1的对象,则整个火车1都是垃圾。

 

深入java虚拟机 - 垃圾收集 - 火车算法

图二

如果火车1中有对象被其它火车引用,见图三,扫描车厢1.1时发现对象A被火车2中的E引用,则将对象A从车厢1.1转移到车厢2.2,然后扫描A引用的对象D,把D也转移到车厢2.2,然后扫描D,看D是否引用其它对象,如果引用了其它对象则也要转移,依次类推。扫描完火车1的所有对象后,剩下的没有转移的对象都是垃圾,可以把整个火车1都作为垃圾回收。注意如果在转移时,如果车厢2.2空间满了,则要在火车2末尾开辟新的车厢2.4,将新转移的对象都放到2.4,即火车的尾部)

深入java虚拟机 - 垃圾收集 - 火车算法

图三

     补充说明:垃圾回收器一次只扫描一个车厢。图三中的对象B与C并不是立即被回收,而是先会被转移到火车1的尾部车厢。即扫描完1.1后,B被转移到火车1尾部,扫描完1.3后,C被转移到车尾。等垃圾收集器扫描到火车1尾部时,如果仍然没有外部对象引用它们,则B和C会被收集。

     火车算法最大的好处是它可以保证大的循环结构可以被完全收集,因为成为垃圾的循环结构中的对象,无论多大,都会被移入同一列火车,最终一起被收集。还有一个好处是这种算法在大多数情况下可以保证一次垃圾收集所耗时间在一定限度之内,因为一次垃圾回收只收集一个车厢,而车厢的大小是有限度的。


下面是《深入java虚拟机第二版》的截图:

深入java虚拟机 - 垃圾收集 - 火车算法

深入java虚拟机 - 垃圾收集 - 火车算法

深入java虚拟机 - 垃圾收集 - 火车算法

深入java虚拟机 - 垃圾收集 - 火车算法

深入java虚拟机 - 垃圾收集 - 火车算法

深入java虚拟机 - 垃圾收集 - 火车算法

深入java虚拟机 - 垃圾收集 - 火车算法

深入java虚拟机 - 垃圾收集 - 火车算法

深入java虚拟机 - 垃圾收集 - 火车算法

深入java虚拟机 - 垃圾收集 - 火车算法