9.4 JAVA内存泄露介绍

Java的最显著的优点之一是内存管理。你只需要简单创建对象,java的垃圾收集器来负责分配和释放内存。但是,情况并不是这么简单,因为java程序中常发生内存泄露。

本教程说明什么是内存泄露?为什么会发生这种情况,以及如何防止他们。

1、什么是内存泄露

内存泄露:应用程序不再使用对象,但是垃圾回收器无法将其删除,因为它们被引用。
要理解这个定义,我们需要了解内存中的对象状态。下图说明了什么是未使用的,是什么未引用的。

9.4 JAVA内存泄露介绍_第1张图片
对象内存引用说明.png

从图中可以看出引用对象和未引用对象。未引用对象将被垃圾回收,而引用对象不会被垃圾回收。未引用的对象肯定是未使用的,因为没有其他对象应用它。但是,未使用的对象并不全部未引用,其中有一些是被引用的。这是内存泄露的地方。

2、内存泄露为什么会发生

我们来看看下面的例子,看看为什么会发生内存泄露。在下面的例子中,对象A引用对象B。
A对象生存期(t1-t4)比B(t2-t3)长的多。当B在应用程序中不再被使用时,A仍然保留对它的引用。这样垃圾收集器不能从内存中删除B。这可能导致内存不足的问题,因为如果A对象对更多对象执行相同的操作,那么会有很多未被收集的对象消耗内存空间。B也可能存在一些其他对象的引用。B引用的对象不会被收集。所有这些未使用的对象将消耗宝贵的内存空间。

9.4 JAVA内存泄露介绍_第2张图片
内存对象生命周期

3、如何防止内存泄露

以下是一些用于防止内存泄露的使用技巧。
1、注意集合类,如HashMap、ArrayList等,因为它们是找到内存泄露的常见位置。当它们被声明为静态时,其使用的寿命与应用程序的寿命相同。
2、注意事件监听器和回调。。如果在不再使用该类的情况下,监听器被注册,但是未被注销,则可能发生内存泄露。
3、如果一个类管理自己的内存,那么程序员应该警惕内存泄露。通常指向其他对象的对象成员变量需要为空。

4. 一个小问题:为什么在JDK6中的substring()方法可能会导致内存泄露。

回答这个问题,你可以看看substring在Java6和Java7中的内存实现。

引用:
References:[1] Bloch, Joshua. Effective java. Addison-Wesley Professional, 2008.[2] IBM Developer Work. http://www.ibm.com/developerworks/library/j-leaks/

你可能感兴趣的:(9.4 JAVA内存泄露介绍)