强烈引用的对象没有淘汰记忆错误 - 原因



从这篇文章中,强烈的参考永远不会收集垃圾,如果我们在内存中创建一个无限的 Strong Reference objects,则假设我假设它必须丢弃 OutOfMemory error。

但是,当我在虚拟程序下运行时,它永远不会通过OutOfMemory错误,尽管我在循环时创建了无限的对象。

public class Test2 {
    public static void main(String[] args) {
        while (true) {
            Test2 obj = new Test2();
            System.out.println(obj);
        }
    }
}

请帮助我了解是否从未收集过强引用的对象,那么如何出现OOM错误。

您不保留对对象的强烈引用。每次您遍历循环时,都不再对上次迭代中创建的对象进行任何参考,并且有资格获得垃圾收集。

如果可以通过强引用从GC-ROOT-OBROTS到达,则不会收集垃圾。在您的示例中,随时只能从线程达到一个Test2 -Object。强参考obj已更新每次迭代,因此以前的Test2 -Object不再从任何地方强烈引用,并且可以收集垃圾。

如果要创建一个OOM,则可以将新对象添加到List并将其保存在那里。

最新更新