什么是Java中的过时引用?

25

我正在阅读Effective Java,遇到了这个术语“Obsolete Reference”。 什么时候是过时的引用?我认为所有不超出作用域且未使用的对象都是过时的引用。如果我错了,请纠正我。


1
在书中pop()方法的示例中(例如“return elements[--size];”),它基本上返回一个对象,通过仅操作计数器(例如“--size”)来调整数组的大小,但它实际上并没有真正调整数组的大小——数组仍然包含对象引用。为了使其可供GC使用,还应该将该索引标记为空值。 - Victor
5个回答

14

“过时引用”(在书中使用,但并不是广泛使用的技术术语)指的是一个被保留但永远不会被使用的引用,阻止了其所指向的对象被垃圾回收器进行处理,从而导致内存泄露。


5

过时引用是指永远不会再被解除引用的引用。

来自Effective Java

在Java中,保留过时引用构成了内存泄漏。这也被称为无意间对象保留。

将引用设置为null以消除对对象的过时引用是好的,但不要过度使用。消除过时引用的最佳方法是重用包含它的变量或让其超出范围。

例如,要删除过时引用,则:

public Object pop() {
    if (size == 0)
        throw new EmptyStackException();
    Object result = elements[--size];
    elements[size] = null; // Eliminate obsolete reference
    return result;
}

在《Effective Java》中提到了这样的话:“每当一个类管理自己的内存时,程序员都应该警惕内存泄漏”.. 这是否意味着类中的所有引用变量都被程序员清空为null? - PrabaharanKathiresan

2

你说得对。基本上,过时的引用是指不影响程序后续流程的东西,应该将其设置为null以帮助垃圾收集。

例如:

String a="一些值"; . . . . . . //这里进行一些处理 //处理完成后执行以下操作 a=null; //a是过时的引用


0

未使用的对象,仍然具有引用(可能不是有意的),而且这些引用没有被您的应用程序/程序/代码所引用,那么这些引用就是过时的引用。由于这些未使用的对象仍然存在引用,因此对于这些对象以及这些对象内部的对象,垃圾回收是不可能的,这会导致内存泄漏问题。


0
简单来说,即使从方法中弹出了值,该值仍然通过其索引指向数组内部。因此,即使程序真的完成了传递的引用副本,由于堆栈中使用了元素数组,它仍将存在于堆中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接