您的位置:首页 > 编程语言 > Java开发

JAVA消除过期的对象引用

2005-01-10 17:11 393 查看
  下面的例子存在内容泄漏(或者说无意识的对象保持,unintentional object retention)。
//Can u spot the "memory leak"?
public class Stack{
private Ojbect[] elements;
private int size=0;
public Stack(int initialCapacity){
this.elements=new Object[initialCapacity];
}
public void push(Object e){
ensureCapacity();
elements[size++]=e;
}
public Object pop(){
if(size==0) throw new EmptyStackException();
return elements[--size];
}
/**
*Ensure space for at least one more element, roughly doubling
*the capacity each time the array needs to grow.
*/
private void ensureCapacity(){
if(elements.length==size){
Object[] oldElements=elements;
elements=new Object[2*elements.length+1];
System.arrayCopy(oldElements,0,elements,0,size);
}
}
}
  消除内容泄露,只需要改动pop()方法。
public Object pop(){
if(size==0) throw new EmptyStackException();
Object result= elements[--size];
elements[size]=null;
return result;
}
  只要一个类自己管理它的内存,程序员就要警惕内存泄露问题。一旦一个元素被释放掉,则该元素中包含的任何对象引用应该要被清空。
  内存泄露的另一个常见来源是缓存,因此这时要用一个线程定期清缓存或在加入时清最少使用的缓存对象。在1.4发行版中,可以用java.util.LinkedHashMap的revmoveEldestEntry方法来实现后一方案。
  如果一个持续运行的java应用速度越来越慢,就要考虑是否检查内存泄露问题。
  书中说检查内存泄露的软件统称heap profiler,我检索到了两个http://sourceforge.net/projects/simpleprofiler和http://www.manageability.org/blog/stuff/open-source-profilers-for-java,以后有机会可得好好研究一番。不知读到此文的朋友,能否再推荐几个好的工具软件?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: