Inspect Memory Leak

Posted 每天更强一点...

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Inspect Memory Leak相关的知识,希望对你有一定的参考价值。

Try to inspect the memory leak in the following code:

// Can you spot the "memory leak"?
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];
}
/**
* 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)
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}

If a stack grows and then shrinks, the objects that were popped off the stack will not be garbage collected, even if the program using the stack has no more references to them. This is because the stack maintains obsolete references to these objects. An obsolete reference is simply a reference that will never be dereferenced again. In this case, any references outside of the “active portion” of the element array are obsolete. The active portion consists of the elements whose index is less than size.

public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null; // Eliminate obsolete reference
return result;
}

Nulling out obselete references could fix it, but this should be the exception rather than the norm. Also WeakHashMap could be helpful.

 

以上是关于Inspect Memory Leak的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 4 Memory Leak Instrument如何获取发生泄漏的代码行

内存溢出(Oom)和内存泄露(Memory leak)

再记一次Memory Leak分析

JavaScript :memory leak [转]

For Memory Leak Debug

Memory leak by misusing Autofac