gpt4 book ai didi

java - 为什么没有 OutOfMemoryError

转载 作者:行者123 更新时间:2023-12-03 19:38:12 30 4
gpt4 key购买 nike

我不明白为什么这段代码没有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。但是如果运行代码,它将工作很长时间...

我不明白或哪里错了?请解释一下。

最佳答案

这里没有内存泄漏。

考虑以下步骤:

  1. Object[] ref = new Object[1];
    内存:ref --> array 1
  2. ref[0] = new Object[]{ref};
    内存:ref --> array 1 --> array 2 --> array 1
  3. ref = (Object[]) ref[0];
    内存:ref --> array 2 --> array 1 --> array 2 --> ...
  4. ref[0] = new Object[]{ref};
    内存:ref --> array 2 --> array 3 --> array 2 --> ...
    此时,array 1不再被引用,可以被GC回收。
  5. ref = (Object[]) ref[0];
    内存:ref --> array 3 --> array 2 --> array 3 --> ...
  6. ref[0] = new Object[]{ref};
    内存:ref --> array 3 --> array 4 --> array 3 --> ...
    此时,array 2不再被引用,可以被GC回收。

... 循环继续。在每个循环之后,有一个数组不再被引用并且可以进行垃圾回收。只要 GC 正常工作,您就永远不会耗尽内存。

编辑:更正了数组在内存中的链接方式的细节。感谢 Javier 指出这一点。

关于java - 为什么没有 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34466091/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com