1. 程式人生 > >什麽是內存泄漏(轉載自ImportNew)

什麽是內存泄漏(轉載自ImportNew)

ext .com ole map feedback widget 以及 引用 lib

本文由 ImportNew - 範琦琦 翻譯自 Programcreek。歡迎加入翻譯小組。轉載請見文末要求。

Java最顯著的優勢之一就是它的內存管理機制。你只需簡單創建對象,然後Java垃圾回收機制便會小心的分配和釋放內存。然而,事實並非如此簡單,因為在Java應用程序中經常發生內存泄漏。

本教程說明了什麽是內存泄漏,為什麽會發生,以及如何防止它們。

1.什麽是內存泄漏?

內存泄漏的定義: 對象不再被應用程序使用,但是垃圾回收器卻不能移除它們,因為它們正在被引用。

要理解這個定義,我們需要理解對象在內存中的狀態,下圖說明了哪些是未被使用的以及哪些是未被引用的。

技術分享圖片
從圖中可以看到被引用的對象和未被引用的對象。未被引用的對象將會被垃圾回收器回收,而被引用對象則不會被回收。未被引用的對象理所當然是未被使用的,因為沒有其他的對象引用它。然而,未被使用的對象並不一定是未被引用的,其中一些是被引用的。這就是內存泄漏的起因。

2.為什麽會發生內存泄漏?

讓我們來看看下面這個例子,看看為什麽內存泄漏會發生。在如下例子中,對象A引用了對象B。A的生命周期(t1—t4)要比B的生命周期(t2—t3)長很多。當B不再用於應用中時,A仍然持有對它的引用。在這種方式下,垃圾回收器就不能將B從內存中移除。這將可能導致出現內存不足的問題,因為如果A對更多的對象做同樣的事情,那麽內存中將會有很多無法被回收的對象,這將極度耗費內存空間。

也有可能B持有大量對其他對象的引用,這些被B引用的對象也不能夠被回收。所有這些未被使用的對象將會耗費寶貴的內存空間。

技術分享圖片
3.如何阻止內存泄漏?

以下是一些阻止內存泄漏的快速動手技巧。

(1)註意集合類,例如HashMap,ArrayList,等等。因為它們是內存泄漏經常發生的地方。當它們被聲明為靜態時,它們的生命周期就同應用程序的生命周期一般長。

(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/

原文鏈接: Programcreek 翻譯: ImportNew.com - 範琦琦
譯文鏈接: http://www.importnew.com/8715.html
[ 轉載請保留原文出處、譯者和譯文鏈接。]

關於作者: 範琦琦

什麽是內存泄漏(轉載自ImportNew)