Java内存不足错误

Don*_*ald 7 java out-of-memory

为什么这个代码如下

List<Object> list = new ArrayList<>();
while (true) {
    for(int i = 0; i < 1000000; i++){
        list.add(new Object());
    }
}
Run Code Online (Sandbox Code Playgroud)

产生内存不足错误

但是这段代码没有

while(true) {
    List<Object> list = new ArrayList<>();
    for(int i = 0; i < 1000000; i++){
        list.add(new Object());
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以看到它与在while循环内部或在其外部创建的列表有明显的关系,但我不确定为什么会发生这种情况.

Era*_*ran 10

在第一种情况下,您只有一个ArrayList实例,并且Object在内存不足之前不断向其添加新实例.

在第二种情况下,您ArrayList在循环的每次迭代中创建一个新的并向其while添加1000000 Object实例,这意味着ArrayList在上一次迭代中创建的1000000 Object实例和它包含的实例可以被垃圾收集,因为程序不再引用它们.

请注意,如果Object创建新的s比垃圾收集器可以释放旧的更快,则第二个片段也会导致内存不足错误,但这取决于JVM实现.


Mur*_*nik 5

在第一个片段中,列表在循环外部创建(并保留!),因此您只需不断向其中添加元素,直到消耗掉所有可用内存为止.

在第二个片段中,循环的每次迭代while都会创建一个新ArrayList对象.由于在迭代结束后您不再持有对该实例的引用,因此该列表有资格进行垃圾回收,因此旧列表不会被释放,并且您不会耗尽内存.