消除过期的对象引用

只要是自己管理内存,就应该警惕内存泄露问题。一旦元素被释放掉,该元素中包含的任何对象引用都应该被清空。

Tips:自行了解对象和对象引用

Tips:比如自己实现的数组、堆栈、队列等经常会用到内存,使用时应该及其注意

举个例子

    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 o){
             ensureCapacity();
             elements[size++] = o;
         }
   
         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);
        }
    }

对象出栈后没有被清空引用,那么该栈会一直保留着这些已经出栈元素的引用,而且永远不会被解除引用。

    修改:
    public Object pop(){
        if (size == 0) {
            throw new EmptyStackException();
        }
        Object result = elements[--size];
        elements[size] = null;//清空引用,该引用已经不会给引用到了
        return result;
    }

内存泄露通常不会表现成明显的失败,只有通过仔细检查代码,或者借助jvm内存管理工具分析内存泄露问题。

清空对象引用应该是一种例外,而不是一种规范行为。消除过期引用最好的方法是让包含该引用的变量结束其生命周期。比如:让局部变量的作用域范围最小化。