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)才能发现内存泄露哦问题。
网友评论