[英]Why there is no OutOfMemoryError
我无法理解为什么在这段代码中没有OutOfMemoryError
public static void main(String[] args) {
Object[] ref = new Object[1];
while (true) {
ref[0] = new Object[]{ref};
ref = (Object[]) ref[0];
}
}
至于我,上面提到的代码必须按以下方式工作:
Start:
ref = new Object[1];
Loop:
ref[0] = new Object []{ new Object[1] }
ref = new Object []{ new Object[1] }
ref[0] = new Object []{ new Object []{ new Object[1] } }
ref = new Object []{ new Object []{ new Object[1] } }
我的意思是保存每个新对象的链接,垃圾收集器不能删除未使用的对象,因此必须有OutOfMemoryError。 但如果代码运行,它将工作年龄...
我不明白或我错在哪里? 请解释一下。
这里没有内存泄漏。
考虑以下步骤:
Object[] ref = new Object[1];
ref --> array 1
ref[0] = new Object[]{ref};
ref --> array 1 --> array 2 --> array 1
ref = (Object[]) ref[0];
ref --> array 2 --> array 1 --> array 2 --> ...
ref[0] = new Object[]{ref};
ref --> array 2 --> array 3 --> array 2 --> ...
array 1
,因此可以收集GC。 ref = (Object[]) ref[0];
ref --> array 3 --> array 2 --> array 3 --> ...
ref[0] = new Object[]{ref};
ref --> array 3 --> array 4 --> array 3 --> ...
array 2
,因此可以收集GC。 ......并且循环继续。 在每个循环之后,有一个不再引用的数组,它有资格进行垃圾回收。 只要GC完成其工作,您就永远不会耗尽内存。
编辑:更正了数组在内存中的链接细节。 感谢Javier指出这一点。
Start:
ref = new Object[1];
Loop:
ref[0] = new Object []{ new Object[1] }
ref = new Object []{ new Object[1] }
// at this point ref is re-allocated
ref[0] = new Object []{ new Object []{ new Object[1] } }
ref = new Object []{ new Object []{ new Object[1] } }
// at this point ref is re-allocated
在上述两个点处, ref
被重新分配,因此先前的ref
丢失。 由于ref
丢失,这意味着java垃圾收集器已准备好取消引用前一个ref
指向的内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.