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

为什么他们不需要它们,如果有人决定实施使用它们的VM,他们可能遇到什么问题?

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

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

当然,可以检测到循环引用,但可能这样做的开销增加了足够的复杂性,使得其他GC方法更具吸引力。