Java的一个最显著的优点是内存管理。你只须要简单的建立对象而不须要负责释放空间,由于Java的垃圾回收器会负责内存的回收。然而,状况并非这样简单,内存泄露仍是常常会在Java应用程序中出现。web
本篇文章将介绍什么是内存泄露,为何会发生,以及怎样阻止内存泄露。spa
内存泄露的定义:对于应用程序来讲,当对象已经再也不被使用,可是Java的垃圾回收器不能回收它们的时候,就产生了内存泄露。对象
要理解这个定义,咱们须要理解对象在内存中的状态。以下图所示,展现了哪些对象是无用对象,哪些是未被引用的对象;blog
上图中包含了未引用对象和引用对象。未引用对象将会被垃圾回收器回收,而引用对象却不会。未引用对象很显然是无用的对象。然而,无用的对象并不都是未引用对象,有一些无用对象也有多是引用对象,这部分对象正是内存泄露的来源。生命周期
让咱们用下面的例子来看看为何会发生内存泄露。以下图所示,对象A引用对象B,A的生命周期(t1-t4)比B的生命周期(t2-t3)要长,当B在程序中再也不被使用的时候,A仍然引用着B。在这种状况下,垃圾回收器是不会回收B对象的,这就可能形成了内存不足问题,由于A可能不止引用着B对象,还可能引用其它生命周期比A短的对象,这就形成了大量无用对象不能被回收,且占据了昂贵的内存资源。事件
一样的,B对象也可能引用着一大堆对象,这些被B对象引用着的对象也不能被垃圾回收器回收,全部的这些无用对象消耗了大量内存资源。内存
如下是一些阻止内存泄露的经验提示:资源
详情请看如下连接:
http://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/开发
译文连接:http://www.programcreek.com/2013/10/the-introduction-of-memory-leak-what-why-and-how/get