为什么大多数JVM gcs都不使用refcounts?

时间:2011-02-03 20:09:58

标签: java garbage-collection jvm

为什么他们不需要它们,如果某人决定实施使用它们的VM,他们可能面临哪些问题?

2 个答案:

答案 0 :(得分:13)

由于循环引用,引用计数会受到内存泄漏的影响。想象一下,你有一个简单的“节点”对象,它有一个对另一个节点的引用,并假设你设置它自己的引用。即使没有来自全局变量或堆栈变量的句柄,该对象的引用计数也将始终为1,因此它永远不会被垃圾回收并且是泄漏的内存。这是一个简单的例子,但任何循环引用都会遇到同样的问题。

当然,可以检测到周期性参考,但可能这样做的开销增加了其他GC方法更具吸引力的复杂性。

答案 1 :(得分:4)

  1. 计数引用必须在对象外部完成。
  2.  计数参考很慢。处理w /循环引用甚至更慢,但这并非不可能。仍然很慢。
  3.  计数引用实际上非常慢,因为它必须使用CAS +循环
  4.  非计数引用更容易实现,而且更快,尤其是。一些操作系统内存页面技巧。
  5. 如果对象没有转义,可以通过转义分析完全删除引用计数。