我正在尝试使用以下代码重现OutOfMemoryError
:
List<Object> objects = new LinkedList<>();
while (true)
objects.add(new Object());
}
但它实际上从未发生过,我使用-Xmx512和JVM每次只需要大约497 MB然后就不会消耗内存。
我用的是jdk1.8.0_151
任何人都可以帮我弄清楚为什么不抛出错误?
你没有得到java.lang.OutOfMemoryError
,因为你正在创建非常小的对象(new Object()
),你指定的堆大小非常大。如果你想看到OOM,那么:
new Object()
+小堆大小像Xmx64
objects.add(Calendar.getInstance());
)+ Xmx512
这样的重物使用new Object()
+ Xmx512
,您将需要等待很长时间才能获得OOM。
关于你无法访问的代码错误,我想你已经发现你有问题,如果你喜欢下面那么你就不会得到编译错误,但是如果你在WHILE循环之后放了任何语句那么你就会得到那个错误。
while (true){
objects.add(Calendar.getInstance());
System.out.println(objects);
}
编译器可能会删除此代码,因为它被视为死代码而根本不执行它。
尝试在循环中引入类似print语句的副作用。
相当简单(从IntelliJ IDEA中执行):
public class Foo {
public static void main(String[] argv) throws IllegalAccessException {
Collection<byte[]> data = new ArrayList<>();
for (;;) {
data.add(new byte[1000]);
}
}
}
线程“main”中的异常java.lang.OutOfMemoryError:Foo.main中的Java堆空间(Foo.java:15)
进程以退出代码1结束