1.7消除过期的对象引用

2020-12-09  本文已影响0人  flyjar

1.7消除过期的对象引用

1.7.1

​ 以下代码并没有明显的错误,无论如何测试,它都会成功通过每一项测试,但是这个程序中隐藏一个问题。这段程序有一个内存泄露,随着垃圾回收器活动的增加,或者内存占用的不断增加。程序性能的降低会逐渐表现出来。在极端的情况下,这种内存泄露会导致磁盘交换甚者OOM

public Class Stack{
  
    private Object[] elements;
    
    private int size=0;
  
    private static final int DEFAULT_INITIAL_CAPACITY=16;
  
    public Statck(){
      
       elements=new Object[DEFAULT_INITIAL_CAPACITY];
     
   }
   
   public void push(Object 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);
     }
   }
 } 
  

​ 优化后的代码

public Object pop(){
  if(size==0)
         throw new EmptyStackException();
       Object reulst= elements[--size];
      elements[size]=null; //明确垃圾回收器进行回收
      return reulst;
}

总结:清空对象引用应该是一种例外,而不是一种规范行为,一般来说只要类是自己管理内存的,程序员就应该警惕内存泄露问题。

​ 由于内存泄露通常不会表现成明显的失败,所以他们可以在一个系统中存在很多年。往往只有通过仔细检查代码,或者借助于Heap解析工具(Heap Profiler)才能发现内存泄露哦问题。

上一篇下一篇

猜你喜欢

热点阅读