Java中的垃圾收集

sim*_*ion 9 java memory algorithm garbage-collection reference-counting

在我正在修改的幻灯片上说如下:

可以通过维护对每个对象的引用数量的计数,或者通过跟踪来自根的引用链来识别活动对象.

引用计数很昂贵 - 每次参考更改时都需要操作,并且它不会发现周期性结构,但它可以递增地回收空间.

跟踪涉及仅在需要回收空间时识别活动对象 - 将成本从一般访问转移到GC运行的时间,通常仅在内存不足时.

我理解为什么引用计数很昂贵的原则,但不明白什么"没有发现周期性结构,但它可以逐步回收空间".手段.有人能帮我一点吗?

谢谢

aio*_*obe 5

参考计数没有发现周期性结构......

假设你有两个对象O1和O2.它们互相引用:O1 - > O2和O2 - > O1,没有其他对象引用它们.它们都有引用计数1(一个引用者).

如果无法从GC根目录访问O1或O2,则可以安全地对其进行垃圾回收.但是,通过计算引用不会检测到这一点,因为它们的引用计数都大于0.

对于有资格进行垃圾收集的对象,0引用是足够但不是必需的.

......但它可以逐步回收空间.

增量部分指的是这样一个事实,即您可以快速收集一些0引用的对象,中断并在其他时间继续而不会出现问题.

如果跟踪算法被中断,则需要在下次调度时从头开始.(引用树自启动以来可能已经改变了!)