消除过期的对象引用
考虑以下简单的栈实现:
x
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
} p
ublic void push(Object e) {
ensureCapacity();
elements[size++] = e;
} p
ublic Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
} /
**
* Ensure space for at least one more element, roughly
* doubling the capacity each time the array needs to grow.
*/
private void ensureCapacity() {
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
这个程序没有什么明显的错误(但是对于泛型版本,请参阅条目 29)。 你可以对它进行详尽的测 试,它都会成功地通过每一项测试,但有一个潜在的问题。 笼统地说,程序有一个「内存泄漏」,由于 垃圾回收器的活动的增加,或内存占用的增加,静默地表现为性能下降。 在极端的情况下,这样的内存 泄漏可能会导致磁盘分页(disk paging),甚至导致内存溢出(OutOfMemoryError)的失败,但是这样 的故障相对较少 .
垃圾收集语言中的内存泄漏(更适当地称为无意的对象保留 unintentional object retentions)是隐 蔽的
这类问题的解决方法很简单:一旦对象引用过期,将它们设置为 null。 在我们的 Stack 类的情景 下,只要从栈中弹出,元素的引用就设置为过期。
xxxxxxxxxx
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null; // Eliminate obsolete reference
return result;
}
来源:https://www.cnblogs.com/lIllIll/p/12556568.html