繁体   English   中英

为什么OutOfMemoryError不随Object的集合一起复制?

[英]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
  • 您创建了一些繁重的对象,例如Calendar( 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM