对一篇文章的留言
偶然通过链接找到了IMB DW上的一篇文章,留言之后,发现留言并不出现网页上,好象被IBM“吃”掉了:)
原文:Java的内存泄漏(http://www-128.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/)
(我之所以不在标题中使用“java”“gc”“内存泄露”等敏感字眼,实在是不想引发无谓的争论。)
以下是我的留言:
“Java也存在内存泄露问题,其原因主要是一些对象虽然不再被使用,但它们仍然被引用。”
这个结论值得探讨。“对象以后会不会再被使用”是由用户主观决定的,而GC的工作基础只是判断该对象“还有没有被引用”。如果对象因为被引用而没有被释放,显然不是GC的错(它对着呢)。
文中给出的代码很明显不存在内存泄露:
Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
Object o=new Object();
v.add(o);
o=null;
}
当代码执行完“v.add(o);”这一行,Object实际上存在两个引用:o和v。那么在v的生命周期内,Object对象的引用始终被v持有,显然不应该被释放(“v.add(o);”明明持有了对象的引用,却“无理地”要求GC去释放它?)。而当v退出其作用域时,其成员所引用的对象自然被取消引用,从而被GC正常回收。整个过程中根本不存在内存泄露。
另,上面代码的“o=null;”实在多此一举,不存在任何意义。o是局部变量,它在退出作用域时会自动取消“它所引用的对象”的引用!(对一个即将死去的人说“你要死了”有什么用?)