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,但是又用自己的话进行了一点表述,表述不对的,还请各位朋友指出,谢谢!


你可能感兴趣的:(JAVA,SE)