• 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

  • 相关阅读:
    ubuntu下Nodic开发环境搭建
    usb_modeswitch移植
    STM32F4编程手册学习2_内存模型
    STM32F4 编程手册学习1_编程模型
    ARM架构中的程序执行与调用
    锲形文字 数字
    疑问
    lisp 题目
    面试官在面试时让我去破解一个软件,我成功了
    php CI ip限制
  • 原文地址:https://www.cnblogs.com/qwop/p/6637307.html
Copyright © 2020-2023  润新知