Java 为什么使用代码;while(true)new Object();不会导致OutOfMemoryException吗?

Java 为什么使用代码;while(true)new Object();不会导致OutOfMemoryException吗?,java,exception,Java,Exception,为什么编码 while(true) new Object(); 不会导致OutOfMemoryException吗?因为每次循环迭代完成后,对象都符合GC的条件(堆不会因此而被填充)。当JVM需要更多内存时,它可以清理符合条件的对象 我建议阅读垃圾收集的真相(我不能在这里发布链接,因为它有IP,只需谷歌一下)。因为你没有保存对你创建的新对象的任何引用,因此,只要在内存耗尽时删除它们即可。您没有将新对象分配给任何持久变量,因此不会耗尽内存,因为Java虚拟机将在内存耗尽之前对每个对象进行垃圾

为什么编码

while(true)
  new Object();

不会导致OutOfMemoryException吗?

因为每次循环迭代完成后,对象都符合GC的条件(堆不会因此而被填充)。当JVM需要更多内存时,它可以清理符合条件的对象


我建议阅读垃圾收集的真相(我不能在这里发布链接,因为它有IP,只需谷歌一下)。

因为你没有保存对你创建的新对象的任何引用,因此,只要在内存耗尽时删除它们即可。

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

另一方面,如果你说

List<Object> xs = new LinkedList<Object>();
while (true) {
    xs.add(new Object());
}
List xs=newlinkedlist();
while(true){
添加(新对象());
}

这样,它们就不会自动收集垃圾,最终会耗尽内存。

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

因为垃圾收集。由于新对象不是强可访问的,因此GC可以回收(例如“删除”)。万岁@马瑞洛:这是在必要的时候发生的。稍微了解一下JVM的工作原理可能是个好主意。不,在每次对象创建(或)每个对象符合GC的条件后,都不会调用GC。JVM根据配置的GC算法决定何时执行GC。@Mary Ryllo-GC由JVM内部确定调用(可能取决于JVM)-通常在内存消耗达到某些阈值时调用。注意:在C#/.NET中,此示例不成立,因为CLR可以确定列表(由
xs
命名)它本身以后不会使用。我不知道JVM在这个w.r.t局部变量上是怎么说的,@pst,但没有更晚的了,只要循环在运行,xs实际上就被使用了。@MarkoTopolnik啊,好的方面。我忘记了[明显的]依赖性。一个挑剔的问题:我不确定你想到的是哪个
List
类——通常的
java.util.List
,当然是一个接口,这样
xs=newlist()
是一个语法错误——但无论如何,在具有足够大的最大堆大小的64位JVM上,这段代码很可能会在内存耗尽之前以某种“OMG this list is bight by I candle!”结束-P@ruakh:“天哪,这张单子太大了,我应付不了!”,你能更具体地说这句话吗?好奇地想知道会发生什么。