为什么OutOfMemoryError不是用对象集合再现的?

问题描述 投票:2回答:3

我正在尝试使用以下代码重现OutOfMemoryError

List<Object> objects = new LinkedList<>();
while (true)
    objects.add(new Object());
}

但它实际上从未发生过,我使用-Xmx512和JVM每次只需要大约497 MB然后就不会消耗内存。

我用的是jdk1.8.0_151

任何人都可以帮我弄清楚为什么不抛出错误?

java garbage-collection jvm out-of-memory
3个回答
3
投票

你没有得到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);
    }

1
投票

编译器可能会删除此代码,因为它被视为死代码而根本不执行它。

尝试在循环中引入类似print语句的副作用。


0
投票

相当简单(从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结束

© www.soinside.com 2019 - 2024. All rights reserved.