强引用对象没有OutOfMemory错误 - 为什么?

时间:2017-09-29 05:53:21

标签: java garbage-collection

从这篇文章Strong references never be garbage collected开始,基于这种理解,我假设如果我们在内存中创建一个无限Strong Reference objects,那么它必须抛出OutOfMemory错误。

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

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

    }
}

请帮助我理解强引用对象是否永远不会被垃圾回收,那么为什么没有OOM错误。

2 个答案:

答案 0 :(得分:1)

您不保持对该对象的强引用。每次进行循环时,都不再引用上次迭代中创建的对象,并且它有资格进行垃圾回收。

答案 1 :(得分:1)

如果通过强引用从GC-root-object可以访问对象,则不会对对象进行垃圾回收。在您的示例中,任何时候只能从您的线程访问一个Test2 - 对象。每次迭代都会更新强引用obj,因此不再强烈引用先前的Test2 - 对象,并且可以进行垃圾回收。

如果要创建OOM,可以将新对象添加到List并保留在那里。