扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:zhangxinjie 来源:天极论坛整理 2007年10月12日
关键字:
在本页阅读全文(共4页)
由于采用了垃圾回收机制,任何不可达对象(对象不再被引用)都可以由垃圾收集线程回收。因此通常说的Java 内存泄漏其实是指无意识的、非故意的对象引用,或者无意识的对象保持。无意识的对象引用是指代码的开发人员本来已经对对象使用完毕,却因为编码的错误而意外地保存了对该对象的引用(这个引用的存在并不是编码人员的主观意愿),从而使得该对象一直无法被垃圾回收器回收掉,这种本来以为可以释放掉的却最终未能被释放的空间可以认为是被“泄漏了”。
考虑下面的程序,在ObjStack类中,使用push和pop方法来管理堆栈中的对象。两个方法中的索引(index)用于指示堆栈中下一个可用位置。push方法存储对新对象的引用并增加索引值,而pop方法减小索引值并返回堆栈最上面的元素。在main方法中,创建了容量为64的栈,并64次调用push方法向它添加对象,此时index的值为64,随后又32次调用pop方法,则index的值变为32,出栈意味着在堆栈中的空间应该被收集。但事实上,pop方法只是减小了索引值,堆栈仍然保持着对那些对象的引用。故32个无用对象不会被GC回收,造成了内存渗漏。
以下是引用片段: public class ObjStack { private Object[] stack; private int index; ObjStack(int indexcount) { stack = new Object[indexcount]; index = 0; } public void push(Object obj) { stack[index] = obj; index++; } public Object pop() { index--; return stack[index]; } } public class Pushpop { public static void main(String[] args) { int i = 0; Object tempobj; ObjStack stack1 = new ObjStack(64);//new一个ObjStack对象,并调用有参构造函数。分配stack Obj数组的空间大小为64,可以存64个对象,从0开始存储。 while (i < 64) { tempobj = new Object();//循环new Obj对象,把每次循环的对象一一存放在stack Obj数组中。 stack1.push(tempobj); i++; System.out.println("第" + i + "次进栈" + "\t"); } while (i > 32) { tempobj = stack1.pop();//这里造成了空间的浪费。 //正确的pop方法可改成如下所指示,当引用被返回后,堆栈删除对他们的引用,因此垃圾收集器在以后可以回收他们。 /* * public Object pop() {index - -;Object temp = stack [index];stack [index]=null;return temp;} */ i--; System.out.println("第" + (64 - i) + "次出栈" + "\t"); } } } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者