Java最顯著的優點之一就是它的內存管理機制。你只需簡單建立對象,而後Java垃圾回收機制便會當心的分配和釋放內存。然而,事實並不是如此簡單,由於在Java應用程序中常常發生內存泄漏。程序員
本教程說明了什麼是內存泄漏,爲何會發生,以及如何防止它們。spa
內存泄漏的定義: 對象再也不被應用程序使用,可是垃圾回收器卻不能移除它們,由於它們正在被引用。.net
要理解這個定義,咱們須要理解對象在內存中的狀態,下圖說明了哪些是未被使用的以及哪些是未被引用的。對象
從圖中能夠看到被引用的對象和未被引用的對象。未被引用的對象將會被垃圾回收器回收,而被引用對象則不會被回收。未被引用的對象理所固然是未被使用的,由於沒有其餘的對象引用它。然而,未被使用的對象並不必定是未被引用的,其中一些是被引用的。這就是內存泄漏的原由。blog
讓咱們來看看下面這個例子,看看爲何內存泄漏會發生。在以下例子中,對象A引用了對象B。A的生命週期(t1—t4)要比B的生命週期(t2—t3)長不少。當B再也不用於應用中時,A仍然持有對它的引用。在這種方式下,垃圾回收器就不能將B從內存中移除。這將可能致使出現內存不足的問題,由於若是A對更多的對象作一樣的事情,那麼內存中將會有不少沒法被回收的對象,這將極度耗費內存空間。教程
也有可能B持有大量對其餘對象的引用,這些被B引用的對象也不可以被回收。全部這些未被使用的對象將會耗費寶貴的內存空間。生命週期
3.如何阻止內存泄漏?事件
如下是一些阻止內存泄漏的快速動手技巧。內存
(1)注意集合類,例如HashMap,ArrayList,等等。由於它們是內存泄漏常常發生的地方。當它們被聲明爲靜態時,它們的生命週期就同應用程序的生命週期通常長。get
(2)注意事件監聽器和回調,若是一個監聽器已經註冊,可是當這個類再也不被使用時卻未被註銷,就會發生內存泄漏。
(3)「若是一個類管理它本身的內存,程序員應該對內存泄漏保持警戒。」[1] 不少時候當一個對象的成員變量指向其餘對象時,再也不使用時須要被置爲null。
爲了回答這個問題,您可能須要閱讀JDK6和7中的substring()。
參考文獻:
[1]Bloch,Joshua.Effective Java.Addison-Wesley Professional, 2008
[2]IBM Developer Work.http://www.ibm.com/developerworks/library/j-leaks/