什么是内存泄漏

Java最显著的优点之一就是它的内存管理机制。你只需简单建立对象,而后Java垃圾回收机制便会当心的分配和释放内存。然而,事实并不是如此简单,由于在Java应用程序中常常发生内存泄漏。程序员

本教程说明了什么是内存泄漏,为何会发生,以及如何防止它们。spa

1.什么是内存泄漏?

内存泄漏的定义: 对象再也不被应用程序使用,可是垃圾回收器却不能移除它们,由于它们正在被引用。.net

要理解这个定义,咱们须要理解对象在内存中的状态,下图说明了哪些是未被使用的以及哪些是未被引用的。对象

从图中能够看到被引用的对象和未被引用的对象。未被引用的对象将会被垃圾回收器回收,而被引用对象则不会被回收。未被引用的对象理所固然是未被使用的,由于没有其余的对象引用它。然而,未被使用的对象并不必定是未被引用的,其中一些是被引用的。这就是内存泄漏的原由。blog

2.为何会发生内存泄漏?

让咱们来看看下面这个例子,看看为何内存泄漏会发生。在以下例子中,对象A引用了对象B。A的生命周期(t1—t4)要比B的生命周期(t2—t3)长不少。当B再也不用于应用中时,A仍然持有对它的引用。在这种方式下,垃圾回收器就不能将B从内存中移除。这将可能致使出现内存不足的问题,由于若是A对更多的对象作一样的事情,那么内存中将会有不少没法被回收的对象,这将极度耗费内存空间。教程

也有可能B持有大量对其余对象的引用,这些被B引用的对象也不可以被回收。全部这些未被使用的对象将会耗费宝贵的内存空间。生命周期

3.如何阻止内存泄漏?事件

如下是一些阻止内存泄漏的快速动手技巧。内存

(1)注意集合类,例如HashMap,ArrayList,等等。由于它们是内存泄漏常常发生的地方。当它们被声明为静态时,它们的生命周期就同应用程序的生命周期通常长。get

(2)注意事件监听器和回调,若是一个监听器已经注册,可是当这个类再也不被使用时却未被注销,就会发生内存泄漏。

(3)“若是一个类管理它本身的内存,程序员应该对内存泄漏保持警戒。”[1] 不少时候当一个对象的成员变量指向其余对象时,再也不使用时须要被置为null。

4.一个小测验:为何在JDK6中substring()方法会引发内存泄漏?

为了回答这个问题,您可能须要阅读JDK6和7中的substring()

参考文献:
[1]Bloch,Joshua.Effective Java.Addison-Wesley Professional, 2008
[2]IBM Developer Work.http://www.ibm.com/developerworks/library/j-leaks/

相关文章
相关标签/搜索