Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强引用对象没有OutOfMemory错误-为什么?_Java_Garbage Collection - Fatal编程技术网

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

Java 强引用对象没有OutOfMemory错误-为什么?,java,garbage-collection,Java,Garbage Collection,从这篇文章中,基于这种理解,我假设如果我们在内存中创建一个无限的强引用对象,那么它必须抛出OutOfMemory错误 然而,当我在虚拟程序下面运行时,它从未通过OutOfMemory错误,尽管我在while循环中创建了无限个对象 public class Test2 { public static void main(String[] args) { while (true) { Test2 obj = new Test2();

从这篇文章中,基于这种理解,我假设如果我们在内存中创建一个无限的
强引用对象
,那么它必须抛出
OutOfMemory
错误

然而,当我在虚拟程序下面运行时,它从未通过
OutOfMemory
错误,尽管我在while循环中创建了无限个对象

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

    }
}

请帮助我了解,如果强引用对象从未被垃圾收集,那么为什么没有
OOM
错误。

您没有保留对该对象的强引用。每次通过循环时,都不再有对上次迭代中创建的对象的任何引用,并且它符合垃圾收集的条件。

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


如果要创建OOM,可以将新对象添加到
列表中
,并将它们保留在那里。

它们一旦超出范围就会被垃圾收集;“就是说,马上。”希莫塞尔-你看过我贴的帖子了吗?答案上有80个喜欢,如果你知道其他的东西,请在答案中详细说明,以便我们能够理解。请注意,你的观点是什么?没有“强引用对象”这样的东西。您的代码创建了许多对象,但只分配了一个强引用。@shmosel--是的,请在Louis和piet的帮助下理解它。。非常感谢……:)的澄清