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