JAVA内存泄露(Effective java学习),
分享于 点击 16657 次 点评:275
JAVA内存泄露(Effective java学习),
话说,程序员的进步还是得多看书学习。最近就在看《Effective Java》这本书。谈到了内存泄露,下面就简单的说一说,并附上书上的一段代码(有点小的改动,主要是为了学习抛异常)。
内存泄漏定义:对象已经没有被程序使用,但是垃圾回收器没有办法移除它们,因为还在被引用着。话不多说,先上一段代码,简单的栈实现例子:
import java.util.Arrays;
public class Stack {
private static final int DEFAULT_INITIAL_CAPACITY = 1;
private int size = 0;
private Object[] elements;
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 StackNoElementException();
return elements[--size];
}
public void ensureCapacity() {
if(elements.length==size){
elements = Arrays.copyOf(elements, 2*size+1);
}
}
/**
* 异常内部类
* @author Administrator
*
*/
public static class StackNoElementException extends RuntimeException{
private static final long serialVersionUID = -5211597665137404808L;
public StackNoElementException(){
}
}
public static void main(String[] args) {
Stack stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.size);
}
}
上面的代码简单地实现了栈,当我们入栈了许多元素,并在元素出栈的时候(出栈的pop方法已红色标记),我们会发现我们仅仅是返回了栈中元素的引用,而并未让这个引用重新指向null,这个时候,我们即使弹出了元素,这个引用还是一直存在,但是,这个引用所指向的对象,我们在后期却不再使用了,这个对象就成了一个过期的引用对象。这个时候,就会发生内存溢出。那么,如何解决这个内存溢出呢?修改pop()方法的代码,如下:
public Object pop(){
if(size==0)
throw new StackNoElementException();
Object o = elements[--size];
elements[size] = null;
return o;
}
由于我们清空了过期引用,就不会存在内存泄露的问题了。
个人水平有限,文章中的内容基本来自effective java,但是又用自己的话进行了一点表述,表述不对的,还请各位朋友指出,谢谢!
相关文章
- 暂无相关文章
用户点评