消除过期的对象引用

点点圈 提交于 2020-03-24 06:30:24

消除过期的对象引用

考虑以下简单的栈实现:

 
 
 
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;
}
 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!