Java内存泄露例子
2015-08-19 15:56
561 查看
直接上例子:
如果自己实现了一个栈,
那么当前size对象虽然已经弹出了,但是
由于Java的
看到最后一句显式设为null,注释都写好了,to let gc do its work。-,-
另外在《Practical Java》中把“不使用的对象应手动赋为null”作为一条推荐的编码规则,在周志明的《深入理解Java虚拟机》的Chapter8中也有说明。
如果自己实现了一个栈,
pop方法实现如下:
[code]public Object pop(){ if(size==0) throw new EmptyStackException(); return element[--size]; //短暂造成内存泄露 }
那么当前size对象虽然已经弹出了,但是
element仍然持有这个对象的引用,必须要等到
push操作覆盖这个引用
GC才可以工作。
再看看Java中的栈是怎么实现的
Stack.java[code] public synchronized E pop() { E obj; int len = size(); obj = peek(); removeElementAt(len - 1); return obj; }
由于Java的
Stack直接继承了
Vector直接调用了
Vector的
removeElementAt方法,看下这个方法:
[code] public synchronized void removeElementAt(int index) { modCount++; if (index >= elementCount) { throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); } else if (index < 0) { throw new ArrayIndexOutOfBoundsException(index); } int j = elementCount - index - 1; if (j > 0) { System.arraycopy(elementData, index + 1, elementData, index, j); } elementCount--; elementData[elementCount] = null; /* to let gc do its work */ }
看到最后一句显式设为null,注释都写好了,to let gc do its work。-,-
另外在《Practical Java》中把“不使用的对象应手动赋为null”作为一条推荐的编码规则,在周志明的《深入理解Java虚拟机》的Chapter8中也有说明。
相关文章推荐
- java并发编程-Executor框架
- 我的eclipse插件推荐
- MyBatis <set>标签的使用
- 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例
- 【微信】微信获取TOKEN,以及储存TOKEN方法,Spring quartz让Token永不过期
- 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例
- mybatis Java API
- J-4 Java语言基础
- java.lang.UnsatisfiedLinkError: Create
- java向文件中追加内容与读写文件内容源码
- Windows环境下教你用Eclipse ADT 插件生成.h/.so文件,Java下调用JNI,轻松学习JNI
- java实现二叉树的遍历
- spring+quartz 动态任务方案
- 传智springMVC笔记
- Java 传统线程技术
- java设计思想(2)
- Java的非访问控制符:static,final,abstract
- 补充:修改Myeclipse的servlet模板
- JAVA STRING FORMAT 简介
- Eclipse开发Android程序引入第三方jar包的方法