EffectiveJava(6)消除过期对象的引用

消除过期对象的引用

过期引用 – 在操作集合类的时候,未清理过期的对象引用(即:过期引用),常会导致内存泄露.从而报outOfmemory错误.
1.过期对象导致内存泄漏.
2.一旦对象引用过期,清除这些引用
3.如果一个过期对象中引用了其他对象,那么其引用的对象也不会被清除
4.WeakHashMap代表缓存时,过期将自动清除缓存(当所要的缓存项的生命周期是由该键的外部引用而不是值决定时,WeakHashMap才有用处)
5.LinkedHashMap 给缓存添加新条目的时候顺便清理缓存

例子

“`
public class StackMemory {
public Object[] elements;

public int size = 0;    
//private static final int DEFAULT_INITIAL_CAPACITY = 16;   
public StackMemory(int DEFAULT_INITIAL_CAPACITY){
    elements = new Object[DEFAULT_INITIAL_CAPACITY];
}

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

/**
 * 
 * @return 让一个栈先增长后收缩,从栈中弹出来的对象永远不会被当做垃圾回收
 */
public Object pop(){
    if(size == 0)
        throw new EmptyStackException();

    //一旦对象引用过期,清空引用
    //清空elements[]并返回result  此时result只有  elements[--size]的值(一个)
    Object result = elements[--size];
    elements[size] = null;
    return result;

    //直接返回object[] 没有将其清空
    //return elements[--size];          
}

private void ensureCapacity() {
    // TODO Auto-generated method stub
    if(elements.length == size){
        elements = Arrays.copyOf(elements, 2*size+1);
    }       
}

}

测试代码
for (int i = 0; i < 9; i++) {
String str = “testStackMemory” + i;
stackMemory.push(str);
}
String strB = new String((String) stackMemory.pop());
System.out.println(strB + ” “);
System.out.println(stackMemory.elements[8]);

“`如果不清空对象引用的话,将会返回三个testStackMemory8,否则,输出结果为testStackMemory8,null,null

原文地址:https://www.cnblogs.com/qwop/p/6637307.html