您的位置:首页 > 编程语言 > Java开发

什么样的java代码容易memory leak?

2009-11-08 14:51 211 查看
很多developer知道java也可能memory leak,关于这个主题已经有很多文章了。我这里只想分享一下自己的memory leak的经验。

说明一下这里指的memory leak是程序不及时释放heap导致的OutOfMemoryError.

首先一种情况是collection或者是map一直被put数据,没有机会remove,导致OutOfMemoryError。尤其是当collection或者是map被设计成static变量的时候,它就是个global性质的变量,很可能永远不会被赋为null。这也是不建议使用static变量的一个原因。

有人会察觉到就算collection赋为null,元素还是可能未被释放:

Object o= new Object ();
ArrayList<Object > l=new ArrayList<Object >();
l.add(o);
l=null;
System.out.println(o==null);// "false" will be printed


原因在于这个o 还是可能被程序reference到。而一般情况下我们遇到的是:

l.add(new Object ());

在这种情况下,l=null, o也被GC了。

我也看到有文章提到在listener的模式下,如果listener一直在注册register而没有机会remove也会导致OutOfMemoryError。其实listener也是一个list的结构,本质上是一样的。很多listener是以匿名类被构造和注册到被监听类上面去的, 而被监听类如果也没有正确remove注册的listener的话也会导致OutOfMemoryError。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: