java中的copy collector如何设法从visting中跳过死对象?

时间:2015-05-01 09:39:25

标签: java garbage-collection

我试图了解java中的copy collector是如何工作的。但是复制收集器的优点似乎有点令人困惑,它会跳过对所有应该收集的对象的访问,并将活动对象移动到堆的另一半。所以我的问题是gc如何在不访问它们的情况下调用死对象的finalize,或者不计入访问对象?

1 个答案:

答案 0 :(得分:2)

我认为混淆是"访问"。

的定义

最初所有对象都需要被访问"通过强引用无法访问的内容放在各种内部队列中(参见弱/软/幻像引用),包括终结队列。

在整个过程中,对象仍然被认为是可达的,因此不能由GC收集。 (确实终结者的一个问题是,有可能意外地恢复一个垂死的物体。)一旦物体通过所有这些队列,只有这样才被认为是完全可回收的。

该声明的含义是,一旦完成上述所有操作,复制收集器就不需要重新访问它们,只需复制活动对象(包括仍在终结器队列中的对象)即可幸存者的空间,让其他人留下。

这与压缩收集器相比,压缩收集器必须检查整个堆,找到间隙的位置,并尝试通过确定哪个活动对象最适合间隙来最小化它们(显然实际算法将更多比那更聪明:))。

这里的权衡是,使用副本收集器,您只能使用一半的堆,并且必须复制所有活动对象,即使没有间隙。你得到的回报是一个完全压缩的堆,这对快速分配和缓存很有用。

以上所有这些都使得复制收集器非常适合年轻一代收藏,而压缩收集器传统上用于终身收藏。

有趣的是,Java 7中引入的G1收集器提供了一种不同的方法:在这个系统中,堆被分成许多相同大小的区域,并尝试识别哪些区域主要包含垃圾,优先处理它们进行复制。