什麼是內存泄漏

轉載:https://mp.weixin.qq.com/s/4UHYxQxuB5fQTwFXZevpmg


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


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


1.什麼是內存泄漏?

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


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


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


2.爲什麼會發生內存泄漏?

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


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


3.如何阻止內存泄漏?

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

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

  • 注意事件監聽器和回調,如果一個監聽器已經註冊,但是當這個類不再被使用時卻未被註銷,就會發生內存泄漏。

  • “如果一個類管理它自己的內存,程序員應該對內存泄漏保持警惕。”[1] 很多時候當一個對象的成員變量指向其他對象時,不再使用時需要被置爲null。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章