为什么代码“while(true)new Object()”不会导致OutOfMemoryException?

时间:2012-11-09 19:44:49

标签: java exception

为什么代码

while(true)
  new Object();

不会导致OutOfMemoryException?

4 个答案:

答案 0 :(得分:10)

因为一旦完成每个循环迭代,该对象就有资格获得GC(因此,HEAP将不会被填充)。当JVM需要更多内存时,它可以清理符合条件的对象。

我建议阅读关于垃圾收集的真相(我无法在此处发布链接,因为它有IP,只是google)。

答案 1 :(得分:5)

您没有将新Object分配给任何持久变量,因此您不会耗尽内存,因为Java虚拟机会在您有可能耗尽内存之前对每个Object进行垃圾收集。

另一方面,如果你说

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

然后他们不会自动收集垃圾,你最终会耗尽内存。

答案 2 :(得分:2)

因为您没有保存对您创建的新对象的任何引用,所以garbage-collector只要在内存不足时就可以删除它们。

答案 3 :(得分:2)

JVM保证,无论您创建多少垃圾,如果剩余可回收堆,您将无法收到OutOfMemoryError。唯一的例外是当GC性能开销超过定义的阈值时。然而,在你的情况下,GC-ing实际上是完全无关紧要且闪电般快速:在每个次要的收集周期中,所有对象都被收集为线程局部区域中的一个巨大块。