6.消除过期的对象引用
例子:
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack(){
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
public void push(Object e){
ensureCapacity();
elements[size++] = 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);
}
}
}
在支持垃圾回收的语言中,内存泄露是很隐蔽的。如果一个对象的引用被无意识的保留起来了,那么垃圾回收机制不仅不会处理这个对象,而且也不会处理被这个对象所引用的所有其他对象。即时只有少量的几个对象引用被无意识的保留下来,也会有许许多多的对象呗排除在垃圾回收机制之外,从而对性能造成潜在的重大影响。
此类问题的修复方法:一旦对象引用已经过期,只需清空这些引用即可,程序会立即抛出NullPointerException异常。
消除引用最好的方法是让包含该引用的的变量结束其生命周期。
内存泄露的诱因:
1 只要类是自己管理内存,就应该警惕内存泄露问题。如例中的‘elements’
2 内存泄露来源于缓存,一旦你吧对象引用放到缓存中,很容易遗忘,导致长期存在于缓存中。
处理方法:可以使用WeakHashMap ,或者由一个后台线程(Timer或者ScheduledThreadPoolExcutor)来完成,或者也可爱给缓存增加新条目的时候进行清理
3源于监听器和其他回调的内存泄露。如果你实现一个API,客户端在这个API中注册回调,却没有显性的取消注册,会造成沉积。
内存泄露剖析工具:Heap Profiler