Java 为什么OutOfMemoryError不能与对象集合一起复制?

Java 为什么OutOfMemoryError不能与对象集合一起复制?,java,garbage-collection,jvm,out-of-memory,Java,Garbage Collection,Jvm,Out Of Memory,我试图用以下代码重现OutOfMemoryError: List<Object> objects = new LinkedList<>(); while (true) objects.add(new Object()); } 但它实际上从未发生过,我使用了-Xmx512,JVM每次只占用497MB,这样就不会消耗内存 我使用jdk1.8.0_151 有人能帮我弄清楚为什么没有抛出错误吗?编译器可能会删除这段代码,因为它被认为是死代码,根本不会执行它 尝试在循环中

我试图用以下代码重现OutOfMemoryError:

List<Object> objects = new LinkedList<>();
while (true)
    objects.add(new Object());
}
但它实际上从未发生过,我使用了-Xmx512,JVM每次只占用497MB,这样就不会消耗内存

我使用jdk1.8.0_151


有人能帮我弄清楚为什么没有抛出错误吗?

编译器可能会删除这段代码,因为它被认为是死代码,根本不会执行它


尝试在循环中引入诸如打印语句之类的副作用

在IntelliJ IDEA中执行起来相当容易:

public class Foo {

    public static void main(String[] argv) throws IllegalAccessException {

        Collection<byte[]> data = new ArrayList<>();
        for (;;) {
            data.add(new byte[1000]);
        }

    }
}
主线程java.lang.OutOfMemoryError中出现异常:java堆空间 在Foo.mainFoo.java:15

进程已完成,退出代码为1

您没有得到java.lang.OutOfMemoryError,因为您正在创建非常小的对象—新对象,并且您指定的堆大小非常大。如果要查看OOM,请执行以下任一操作:

您可以使用小对象新对象+小堆大小,如Xmx64 您可以创建一些较重的对象,如Calendar objects.addCalendar.getInstance;+Xmx512 对于新对象+Xmx512,您必须等待很长时间才能获得OOM

关于无法访问的代码错误,我认为您已经发现了括号问题,如果您像下面这样做,那么您将不会得到编译错误,但是如果您在WHILE循环之后放置任何语句,那么您将得到该错误

    while (true){
        objects.add(Calendar.getInstance());
        System.out.println(objects);
    }

你真的在添加println时检查了第二行是否在循环块中吗?@Am_I_是的,很好,我的想法是在循环中稍后添加一些带有这些对象的操作,但是由于某些原因代码无法访问是的,但这并不是我想要的。显然,这样大小的数组没有足够的连续空间,但对于小对象,它似乎不起作用,只是尝试了1000个相同的效果,1Kb不是一个很大的对象,是吗?与单个对象的大小相比,它相当大,实际上您在问题中没有指定它必须是新对象,这是一个非常无用的构造,如果不一起优化。你想达到什么目标?你想在OOME之后检查恢复,这应该足够好了。我想了解为什么在这种特殊情况下不会抛出错误我对代码做了一些修改,我花了11420584个对象才产生了错误,谢谢!