(32)内存泄漏的潜在危机

虽然java自身带有一个垃圾回收器gc。但是这个gc只是在适当的时候,当某个对象不再使用,也就是不再被引用时,才会想相应的对象。但有些时候,有些对象的引用可能就会情不自禁的忘记断开引用,而一直处于一种引用的状态,虽然我们已经不用了,但是gc还是无法回收。这个样子迟早会导致堆栈内存的溢出,这个时候就需要我们的手动的把应用断开,为gc回收内存创造机会。这往往更体现了代码的严谨性。

下面自己手动实现的一个MyStack类,这个类中的pop方法就是要特别注意的。这个栈的底层是维护的一个Object[]数组:

 

 1 class StackList
 2 {
 3     Object[] elements;
 4     int index = 0;    //当前的索引值
 5     public StackList() {
 6         this.elements = new Object[3];
 7     }
 8     //添加内容
 9     public void add(Object o)
10     {
11         //添加元素之前应当先检查当前的容量是否够用
12         ensureCapacity();
13         elements[index ++] = o;
14     }
15     //出站操作
16     public Object pop()
17     {
18         int tmpIndex = --index;
19         Object o = elements[tmpIndex];
20         elements[tmpIndex] = null;    //不用的要赶紧释放 断开引用为 gc回收创造条件
21         return o;
22     }
23     
24     //检查当前数组的容量是搜狗用
25     public void ensureCapacity()
26     {
27         if(index == elements.length)
28         {
29             int newLength = elements.length*2;
30             elements =  Arrays.copyOf(elements, newLength);
31         }
32     }
33     //获取 当前于都个数
34     public int size()
35     {
36         return index;
37     }
38 }

 

posted @ 2016-11-03 16:33  zhangoliver  阅读(272)  评论(0)    收藏  举报