java最大的优势之一就是内存管理,你可以简单的创建对象, java垃圾回收器会为你分配和回收内存,但是,这种情形也不是那么简单,因为内存泄露在java程序中经常发生。这篇文章介绍了什么是内存泄露,内存泄露是怎么发生的,以及怎么阻止他们。
什么是内存泄露
内存泄露的定义是:应用程序不再使用对象了,但是因为有引用的存在垃圾回收器不能删除他们。
为了理解这个定义,我们需要理解内存中对象的状态,下边这个图解释了什么不是不被使用什么是不被引用。
上边这个图中有引用的对象和不被引用的对象,不被引用的对象将会被垃圾回收器回收,引用的对象不会被垃圾回收器回收,不被引用的对象肯定不会被使用,因为没有其他对象引用它,但是不被使用的对象并不是都没有引用的。他们中有一些还会被引用,这就是内存泄露的原因。
为什么内存泄露会发生
我们来看下边这个例子来看看为什么内存泄露会发生,在下边的例子中,对象A引用对象B,A的生命周期是(t1-t4)比B的(t2-t3)要长一些,当B在应用中不被使用的时候,A依旧保存着B的引用,因此,垃圾回收器不能从内存中移除B。这可能就会导致内存溢出的问题,因为A可能对其他的对象也做同样的事情,这样就会有很多对象不被回收,消耗内存空间。
同样,B也可能拥有其他对象的一些引用,这些对象在B中被引用并且没有被回收,所有这些没有被使用的对象将会消耗稀少的内存空间。
怎么样阻止内存泄露
下边是能够快速上手的阻止内存泄露的一些小技巧
1、注意集合类,比如HashMap,ArrayList等等,因为这些是内存泄露经常出现的地方,当声明为static的时候,他们的生命周期和应用程序的生命周期一样长。
2、关注事件监听和回调,如果一个监听器注册但是没有解除注册那么内存泄露可能会发生。
3、如果一个类自己管理自己的内存,程序员要对内存泄露有所警觉。指向其他对象的对象的成员变量需要被置为null
原文链接:http://www.programcreek.com/2013/10/the-introduction-of-memory-leak-what-why-and-how/