gpt4 book ai didi

java - 关于 Java 垃圾收集器、空值和内存泄漏的问题

转载 作者:搜寻专家 更新时间:2023-11-01 01:00:43 24 4
gpt4 key购买 nike

假设我在 java 中实现一个队列,我有一个对初始节点的引用,称为 ini,另一个指向最后一个节点,称为 last。现在,我开始将对象插入队列。有一次,我决定我想要一个操作来清除队列。然后我这样做:

ini = null;
last = null;

我在泄漏内存吗?我猜 ini 和 last 之间的节点仍然全部链接并且仍然有它们的数据,但同时还有垃圾收集器。

另一种方法是访问每个元素,然后将它们对下一个节点的引用置空,但我基本上会像在 C++ 中那样做,除非我不会明确使用 delete。

最佳答案

只要您的代码中的任何其他地方都没有引用队列中的项目,垃圾收集器就能够回收该内存。在 Java 中将指针设置为 null 与在 C 中不同,在 C 中将 malloc 指针设置为 null 会阻止它被释放。在 Java 中,内存在无法访问时被回收。只要您不通过 JNI 使用 native 代码,Java 中就没有内存泄漏(在 C/C++ 意义上)。

一个简单的垃圾收集器只会计算一个对象的引用次数,并在引用计数达到零时释放该对象,但这将无法处理引用循环(A -> B,A -> B -> C -> A 等)。 Java GC 算法进行 active 测试,构建系统中所有对象的引用图。 GC 进行图形遍历,任何不可访问的节点(对象)都被标记为未使用并可用于重新分配。图的根(遍历的起始点)包括线程堆栈上的变量、静态变量和本地代码通过 JNI 持有的引用。在这里查看更多信息:http://java.sun.com/developer/Books/performance/performance2/appendixa.pdf

仍然有可能引用泄漏。这是指您持有对象引用的时间超过所需时间的情况。例如:

public class Stack {
private final Object[] stack = new Object[10];
private int top = 0;
public void push(Object obj) {stack[top++] = obj;}
public Object pop() {return stack[top--]; }
}

忽略上溢/下溢的可能性,调用 Stack.pop() 后,数组成员变量仍然具有对返回对象的引用。它将阻止该对象被垃圾收集,直到不再引用周围的 Stack 实例。这是需要将变量设置为 null 以便回收其内存的罕见情况之一:

public Object pop() {Object ret = stack[top]; stack[top--] = null; return ret;}

关于java - 关于 Java 垃圾收集器、空值和内存泄漏的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/383833/

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