什么样的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,元素还是可能未被释放:
原因在于这个o 还是可能被程序reference到。而一般情况下我们遇到的是:
l.add(new Object ());
在这种情况下,l=null, o也被GC了。
我也看到有文章提到在listener的模式下,如果listener一直在注册register而没有机会remove也会导致OutOfMemoryError。其实listener也是一个list的结构,本质上是一样的。很多listener是以匿名类被构造和注册到被监听类上面去的, 而被监听类如果也没有正确remove注册的listener的话也会导致OutOfMemoryError。
说明一下这里指的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。
相关文章推荐
- 什么样的Java代码看上去比较专业?
- 什么样的Java代码看上去比较专业?
- [Java学习笔记] 容易被忽略的代码
- JAVA基础知识-常用但容易出错的代码
- 什么样的Java代码看上去比较专业?
- Java读取txt或其他文件以UTF-8格式输出的时候,第一行代码出现“?”乱码的原因及解决方案!
- 提高你的Java代码质量吧:不要随便设置随机种子
- 面试中常见的java问题的代码
- 手把手教你,如何把java代码打包成jar文件以及转换为exe可执行文件
- 代码详解java里的“==”和“equels”区别
- Eclipse中的java、xml代码提示功能设置
- 标准的Java连接Oracle数据库的示例代码
- java线程-synchronized实现可见性代码
- JAVA代码实现MD5加密算法
- 20个开发人员非常有用的Java功能代码(1)
- 用eclipse批量做java代码排版的办法(转)
- Java生成静态页面的简单方法和代码
- 在java中调用javascript代码
- 我是个在校生,现在想用java作为前台代码,连接到SQL server数据库上去,项目是;图书管理系统,现在没有好的java源代码,各位大侠能不能帮个忙?
- 如何在Android上编写高效的Java代码