现在我们正式的项目是不需要手动去清除垃圾,都是自动清除的,这点大家不要多虑。
但是也要有这方面的考虑,比如栈这个数据结构,下面是简单的栈的实现:
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_CAPACITY = 16;
public Stack() {
elements = new Object[DEFAULT_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);
}
}
}
这个代码有内存泄漏,如果一个类的栈先增长,再收缩,那么从栈顶弹出的对象将不会被当做垃圾回收。
这个问题解决起来也简单,一旦引用过期酒设置为null.修改如下所示:
public Object pop() {
if (size == 0) {
throw new EmptyStackException();
}
Object result = elements[--size];
elements[size] = null;
return result;
}
那么。什么时候应该将一个引用设置为null呢?Stack类的哪方面的特性使其容易发生内存泄漏呢?简单的说就是一点:Stack类自己管理自己的内存。
一般的说,每当出现类自己管理自己的内存的情形时,程序员应该警惕内存泄漏。每当释放一个元素时,其中包含的任何对象引用都应该清除。
另一个常见的内存泄露来源时缓存。只有在缓存外有对其键的引用时,它才有存在的意义,那么就可以用weakHashmap来实现。请记住,只有当缓存预期的生命周期由指向键的外部引用而不是由值决定时,weakHashmap才有用。
第三个常见的内存泄露是监听器和其他回调。如果你实现了一个API,客户端注册了回调,但是没有显示地注销,除非你采取一些措施,否则这些回调对象就会不断的积累起来。确保回调及时被垃圾收集处理的一个方法是只存储对他们的弱引用,例如,将其仅作为weakHashmap中的键来存储。
Tips:所有内容开源且不追加任何条件,看完后觉得内容不错,点个赞不为过吧!