什么样的java代码容易memory leak?
很多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。
相关文档:
/*****************TestCar1 begin************************/
public class TestCar1 {
public static final int Ok=1; //正常情况
public static final int Wrong=2; //异常情况
public int run(){
if("车子没有出现故障"){  ......
InputStream is = new FileInputStream(filename);//通过文件名称读取
或
InputStream is =new ByteArrayInputStream(byte[] a);//通过文件的字节数组读取
BufferedImage buff = ImageIO.read(is);
buff.getWidth(); //得到图片的宽度
buff.getHeight(); //得到图片的高度
is.close(); //关闭Stream ......
JAVA自学之路——马士兵
2007年11月06日 星期二 05:47 P.M.[原创 - 尚学堂科技 - 马士兵老师]
JAVA自学之路 一:学会选择
[转载请注明出处:http://www.bjsxt.com/zixue/zixuezhilu_1.html]
为了就业,不少同学参加各种各样的培训。
决心做软件的,大多数人 ......
1、java基础:
JAVA 开发基础知识 | Eclipse 开发环境 | J2SE 5.0 API | J2SE 6.0新特性 | 多线程技术 | Socket 网络技术 | Regular Expression | Java反射技术 | Properties技术 | 各种实战设计模式Factory系列、Singleton、Strategy、Observer等 | Java Debug技术 | 面向对象设计原则详解 | 实例解决面向对象设计 ......