上一篇博文实现了一个栈的demo
其中出栈部分有一些问题,这里谈一下
/**
* 出栈
* @return 出栈元素
*/
public Object pop() {
if (size == 0) {
throw new NullPointerException();
}
// 返回栈顶元素
return elements[--size];
}
以上是出栈方法pop的代码实现,这段代码简单看没有问题,且可以通过任何测试,但是这段代码实际上隐藏着一个内存泄漏的问题。
哪里出现内存泄漏了呢?如果一个栈先增长,再收缩,那么从栈中弹出来的对象将不会被当做垃圾回收,即使使用栈的程序不再引用这些对象,它们也不会被回收。这是因为,栈内部维护着对这些对象的过期引用(obsolete reference)。 所谓的过期引用,是指永远也不会再被解除的引用。在本例中,凡是在elements数组的“活动部分(active portion)”之外的任何引用都是过期的。活动部分是指elements中下标小于size的那些元素。
这个问题的修复比较简单,一旦对象引用已经过期,将该对象的引用置空,这样方便垃圾回收器及时将其回收。
代码修改为