2

为什么要编码

while(true)
  new Object();

会不会导致OutOfMemoryException?

4

4 回答 4

10

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

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

于 2012-11-09T19:45:21.820 回答
5

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

另一方面,如果你说

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

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

于 2012-11-09T19:46:11.280 回答
2

因为您没有保存对您创建的新对象的任何引用,所以垃圾收集器可以在内存不足时简单地删除它们。

于 2012-11-09T19:45:56.273 回答
2

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

于 2012-11-09T19:48:39.557 回答