JAVA内存泄露(Effective java学习)

来源:互联网 发布:c 二维数组输入 编辑:程序博客网 时间:2024/05/16 04:05

话说,程序员的进步还是得多看书学习。最近就在看《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,但是又用自己的话进行了一点表述,表述不对的,还请各位朋友指出,谢谢!


原创粉丝点击