首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

化除过期的对象引用

2012-10-24 
消除过期的对象引用虽然Java有垃圾回收机制,但有时也要考虑内存泄露问题。// Can you spot the memory lea

消除过期的对象引用
虽然Java有垃圾回收机制,但有时也要考虑内存泄露问题。

// Can you spot the "memory leak"?import java.util.*;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];    }    public void push(Object e) {        ensureCapacity();        elements[size++] = e;    }    public 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);    }}

如果一个栈先是增长,然后再收缩,那么,从栈中弹出来的对象将不会被当做垃圾回收。
这是因为栈内部维护着对这些对象的过期引用(obsolete reference),垃圾回收器无法分辨。
只要类是自己管理内存,程序员就应该警惕内存泄露问题。

修复方法:一旦对象引用过期,清空这些引用即可。
public Object pop() {if (size == 0)throw new EmptyStackException();Object result = elements[--size];elements[size] = null;// Eliminate obsolete referencereturn result;}

来自《Effective Java》
Item 6: Eliminate obsolete object references

热点排行