[英]Why isn't OutOfMemoryError reproduced with a Collection of Object?
我正在尝试使用以下代码重现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);
}
编译器可能会删除此代码,因为它被视为无效代码,根本不会执行。
尝试在循环内引入诸如打印语句之类的副作用。
相当容易(从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:Foo.main处的Java堆空间(Foo.java:15)
流程以退出代码1完成
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.