第七条:清除过期的对象引用

现在我们正式的项目是不需要手动去清除垃圾,都是自动清除的,这点大家不要多虑。

但是也要有这方面的考虑,比如栈这个数据结构,下面是简单的栈的实现:

public class Stack {

    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_CAPACITY = 16;

    public Stack() {
        elements = new Object[DEFAULT_CAPACITY];
    }

    public void push(Object e) {
        ensureCapacity();
        elements[size++] = e;
    }

    public Object pop() {
        if (size == 0) {
            throw new EmptyStackException();

        }
        return elements[size--];
    }

    private void ensureCapacity() {
        if (elements.length == size) {
            elements = Arrays.copyOf(elements, 2 * size + 1);
        }
    }
}

这个代码有内存泄漏,如果一个类的栈先增长,再收缩,那么从栈顶弹出的对象将不会被当做垃圾回收。

这个问题解决起来也简单,一旦引用过期酒设置为null.修改如下所示:

    public Object pop() {
        if (size == 0) {
            throw new EmptyStackException();

        }
        Object result = elements[--size];
        elements[size] = null;
        return result;
    }

那么。什么时候应该将一个引用设置为null呢?Stack类的哪方面的特性使其容易发生内存泄漏呢?简单的说就是一点:Stack类自己管理自己的内存。

一般的说,每当出现类自己管理自己的内存的情形时,程序员应该警惕内存泄漏。每当释放一个元素时,其中包含的任何对象引用都应该清除。

另一个常见的内存泄露来源时缓存。只有在缓存外有对其键的引用时,它才有存在的意义,那么就可以用weakHashmap来实现。请记住,只有当缓存预期的生命周期由指向键的外部引用而不是由值决定时,weakHashmap才有用。

第三个常见的内存泄露是监听器和其他回调。如果你实现了一个API,客户端注册了回调,但是没有显示地注销,除非你采取一些措施,否则这些回调对象就会不断的积累起来。确保回调及时被垃圾收集处理的一个方法是只存储对他们的弱引用,例如,将其仅作为weakHashmap中的键来存储。

Tips:所有内容开源且不追加任何条件,看完后觉得内容不错,点个赞不为过吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值