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

Java内存泄露介绍

2015-10-30 18:06 393 查看
java一个最重要的优势就是它的内存管理。你仅仅创建对象,而java垃圾回收器来负责分配和释放内存。然而,情况并不是如此简单,因为java应用中也经常发生内存泄露。

下面的指导展示了什么事内存泄露,为什么会发生内存泄露,以及如何阻止内存泄露。

1.什么事内存泄露?

内存泄露的定义:对象不再被应用程序所使用,但是垃圾回收器不能移除它们,因为它们还被引用。

为了理解这个定义,我们需要理解内存中的对象状态。下面的图标展示了什么是“不被使用”和“不被引用”。



在这个图表中,有被引用的对象和不被引用的对象。不被引用的对象将被垃圾回收器手机,而被引用的对象则不会被当做垃圾回收。不被引用的对象当然是无用的,因为没有其他对象引用它。然而,不被使用的对象并不是全部都是不被引用的。它们中的一些正被引用着!这就是内存泄露的原因。

2.为什么内存泄露会发生?

让我们看一下下面的例子,看一下为什么内存泄露会发生。在下面的例子中,对象A引用对象B。A的生命周期(t1-t4)比对象B(t2-t3)长很多。当B不再在应用程序使用时,A依旧保持了它的一个引用。这样,垃圾回收器将不能从内存中移除B。这将由可能引起内存泄露的问题,因为如果A对很多对象做了这样的事儿,将会有很多对象不能被回收从而消费内存空间。

同样,B也有可能会保持大量其他对象的引用。那些被B引用的对象也不能得到回收。所有这些不被使用的对象将消耗珍贵的内存空间。



3.如何阻止内存泄露?

下面是一些防止内存泄露的速查技巧。

1.注意集合类,诸如HashMap,ArrayList等,因为它们是通常会引发内存泄露的地方。当它们被声明为“静态”时,它们的生命周期是和应用一致的。

2.留意事件监听器和回调。如一个监听器仅被注册但是在不再使用时没有注销掉的情况下,可能会引发内存泄露。

3.“如果一个类自己管理它的内存,程序员应该警惕内存泄露”。最终,一个对象的只想其他对象的成员变量需要被置为null。

4.小调查:为什么JDK6中的substring()方法可能造成内存泄露 ?

要回答这个问题,可以参考Substring()
in JDK 6 and 7.

原文:http://www.programcreek.com/2013/10/the-introduction-of-memory-leak-what-why-and-how/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 内存泄露