java - 为什么 OutOfMemoryError 不能用对象集合重现?

标签 java garbage-collection jvm out-of-memory

我正在尝试使用以下代码重现 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
  • 您创建了一些重对象,例如 Calendar (objects.add(Calendar.getInstance());) + Xmx512

使用new Object() + Xmx512,你将不得不等待很长时间才能获得OOM。

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

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

关于java - 为什么 OutOfMemoryError 不能用对象集合重现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49095997/

相关文章:

java - 使内容节点成为节点的主要父节点

java - 进度条对话框关闭后如何显示警报对话框?

java - 如何将 LLVM 集成到 JVM 运行时

java - 如何从 JDK(SocketChannelImpl 和 SocketDispatcher)更改 Java native 代码(C 实现)并重新编译以与 JDK 一起使用?

.net - 你能重现这个 64 位 .NET 4 GC 错误吗?

java - JVM是如何进行方法查找和调用的?

java - Bukkit API软依赖导入

java - Spring+JSP中如何查看发送请求和得到响应的时间差

java - 如何在 Eclipse 中使用 GCMV?

Java "dead"对象未被垃圾收集