記憶體管理是Java最重要的優勢之一,你只需創建物件,Java垃圾收集器會自動負責分配和釋放記憶體,但是,情況并不那么簡單,因為在Java應用程式中經常發生記憶體泄漏,
本章會說明什么是記憶體泄漏,為什么發生,以及如何防止它們,
什么是記憶體泄漏?
記憶體泄漏的定義:應用程式不再使用的物件,垃圾收集器卻無法洗掉它們,因為它們正在被參考,
為了理解這個定義,我們需要了解物件在記憶體中的狀態,下圖說明了什么是未參考的,什么是參考的物件,

從圖中可以看出,有被參考的物件和未被參考的物件,未參考的物件將被垃圾收集,而被參考的物件將不會被垃圾收集,未參考的物件肯定是未使用的,因為沒有其他物件參考它,但是,未使用的物件并不是全部未被參考,其中一些被參考!這是記憶體泄漏的來源,
為什么記憶體泄漏發生?
讓我們來看看下面的例子,看看為什么發生記憶體泄漏,在下面的例子中,物件A是指物件B,A的生命周期(t1 - t4)比B的(t2 - t3)長得多,當應用中不再使用B時,A仍然有一個B的參考,這樣垃圾收集器就不能從記憶體中洗掉B,這就可能會導致記憶體不足的問題,因為如果A同時為更多的物件做同樣的事情,那么會有很多像B這樣的物件沒有收集并占用記憶體空間,
B也可能擁有一堆其他物件的參考,B參考的物件也不會被收集,所有這些未使用的物件將消耗寶貴的記憶體空間,

如何防止記憶體泄漏?
以下是防止記憶體泄漏的一些快速實用技巧,
-
注意集合類,如HashMap、ArrayList等,因為它們是發現記憶體泄漏的常見地方,當它們被宣告為靜態時,它們的生命時間與應用程式的生命時間是相同的,
-
注意事件監聽器和回呼,如果一個偵聽器被注冊了,但是當類不再被使用時,可能會發生記憶體泄漏,
-
如果一個類管理自己的記憶體,程式應該對記憶體泄漏保持警惕,通常情況下,指向其他物件的成員變數需要為null值,
思考
為什么JDK 6中的substring方法會導致記憶體泄漏?
近期熱文推薦:
1.Java 15 正式發布, 14 個新特性,重繪你的認知!!
2.終于靠開源專案弄到 IntelliJ IDEA 激活碼了,真香!
3.我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看,,
4.吊打 Tomcat ,Undertow 性能很炸!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/200880.html
標籤:其他
上一篇:「MCOI-03」村國題解
