美文网首页
第六条消除过期的对象引用

第六条消除过期的对象引用

作者: 没走过的二丁目 | 来源:发表于2018-03-08 14:39 被阅读0次

    考虑下面的例子(栈的实现)

    public class Stack {
        private Object[] elements;
        private int top;
        private static final int DEFAULT_INITIAL_CAPACITY = 16;
        public Stack(){
            elements = new Object[DEFAULT_INITIAL_CAPACITY];
        }
        public void push(Object object){
            ensureCapacity();
            elements[top++] = object;
    
        }
        public Object pop(){
            if(top == 0){
                throw new EmptyStackException();
            }
            return elements[--top];
        }
        private void ensureCapacity(){
            if(elements.length == top){
                elements = Arrays.copyOf(elements,2* top +1);
            }
        }
    }
    

    这段程序中没有明显的错误,但是隐藏着一个问题 ,即 “内存泄漏” 当一个元素被出栈以后就变成过期的,不会被当做垃圾来回收,这是因为栈内部维护着对这些对象的过期引用,那么如何解决呢?看代码

     public Object pop() {
            if (top == 0) {
                throw new EmptyStackException();
            }
            Object result = elements[--top];
            elements[top] = null;
            return result;
        }
    

    当程序员第一次被这样的问题困扰时,他们往往会过分小心,对于每一个对象一旦不会再用到了就将他置为空,其实完全没有必要

    清空对象引用应该是一种例外,不是一种规范行为

    那么什么时候应该清空引用呢? 答案是只要类是程序员自己管理内存,就应该警惕内存泄漏的问题,一旦元素被释放掉,则该元素中 包含的任何对象的引用都应该被清空。

    内存泄漏的另一个常见来源是缓存。

    一段把对象引用放到缓存中就,他就很容易被遗忘掉,从而使得他不再有用后很长一段时间内任然留在缓存中。如果你将要实现这样一种缓存:只要在缓存之外存在对某个项键的作用,该项就又意义(缓存项的生命周期是由外部引用决定,而不是由值决定时),此时就可以使用weakHashMap

    相关文章

      网友评论

          本文标题:第六条消除过期的对象引用

          本文链接:https://www.haomeiwen.com/subject/seppxftx.html