在最近的JVM中,不可见的引用仍然是一个问题吗?
我正在阅读Java平台性能(可悲的是,自从我最初提出这个问题以来,链接似乎已经从互联网上消失了)和A.3.3节让我担心。
我一直在假设一个超出范围的变量将不再被视为GC根,但本文似乎与此相矛盾。
最近的JVM,特别是Sun的1.6.0_07版本,是否仍然有这个限制?如果是这样,那么我有很多代码要分析...
我问这个问题是因为论文是从1999年开始的 - 有时事情会发生变化,特别是在GC领域。
由于这篇论文不再可用,我想解释一下这种担忧。该论文暗示,在方法中定义的变量将被视为GC根,直到方法退出,而不是直到代码块结束。因此,必须将变量设置为 null,以允许对引用的对象进行垃圾回收。
这意味着在 main() 方法的条件块中定义的局部变量(或包含无限循环的类似方法)将导致一次性内存泄漏,除非您在变量退出范围之前将其清空。
所选答案中的代码很好地说明了问题。在文档中引用的 JVM 版本上,当 foo 对象在 try 块结束时超出范围时,无法对其进行垃圾回收。相反,JVM 将保持打开引用,直到 main() 方法结束,即使任何内容都不可能使用该引用。
这似乎是这样一种想法的起源,即使变量引用为空将有助于垃圾回收器,即使该变量即将退出范围。