6.消除过期的对象引用

2018-03-11  本文已影响0人  哲学与豆包

我们用java管理内存是十分容易的,因为jvm会帮我管理内存的释放,但是这不意味着我们不用担心内存的事情了

造成内存泄漏的地方一般来说有三个:

过期对象的引用

public class Stack {
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    private Object[] elements;
    private int size = 0;

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

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

这个例子看起来是没有任何问题的,可以通过编译,但是会造成内存泄漏!

缓存
解决办法是 所有的缓存我们设置一个过期时间, 过期了就将对象进行销毁

监听器和回调

内存泄漏第三个常见来源是监听器和其他回调,如果客户端在你实现的API中注册回调,却没有显示的取消,那么就会积聚。需要确保回调立即被当作垃圾回收的最佳方法是只保存他的若引用,例如将他们保存成为WeakHashMap中的键。

上一篇下一篇

猜你喜欢

热点阅读