GC只是回收失去引用的对象,但是,由于程序设计失误导致的对象始终被引用,会导致内存泄漏,如下面的代码。用数组实现了一个栈, 支持入栈和出栈操作。
import java.util.EmptyStackException;
/**
* Created by yanwushu@gmail.com on 14-9-21.
*/
public class MyStack {
private Object[] elements;
private int Increment = 10;
private int size = 0;
public MyStack(int size) {
elements = new Object[size];
}
//入栈
public void push(Object o) {
capacity();
elements[size++] = o;
}
//出栈
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object o = elements[--size];
return o;
}
//增加栈的容量
private void capacity() {
if (elements.length != size)
return;
Object[] newArray = new Object[elements.length + Increment];
System.arraycopy(elements, 0, newArray, 0, size);
}
public static void main(String[] args) {
MyStack stack = new MyStack(100);
for (int i = 0; i < 100; i++)
stack.push(new Integer(i));
for (int i = 0; i < 100; i++) {
System.out.println(stack.pop().toString());
}
}
}
当出栈的时候,没有释放数组对元素的引用,那么将导致这个对象始终被数组引用,那么GC是无法回收此对象占用的内存的。
修改的方案是:
//出栈
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object o = elements[--size];
elements[size] = null; //释放引用
return o;
}
关于此问题,做了一个小小的总结:发布到
欢迎指正