1. 程式人生 > >Java中會存在記憶體洩漏嗎,請簡單描述。

Java中會存在記憶體洩漏嗎,請簡單描述。

記憶體洩漏是指不再被使用的物件或者變數一直被佔據在記憶體中。

理論上來說,Java是有GC垃圾回收機制的,也就是說,不再被使用的物件,會被GC自動回收掉,自動從記憶體中清除。

但是,即使這樣,Java也還是存在著記憶體洩漏的情況,
1、長生命週期的物件持有短生命週期物件的引用就很可能發生記憶體洩露。

儘管短生命週期物件已經不再需要,但是因為長生命週期物件持有它的引用而導致不能被回收,這就是Java中記憶體洩露的發生場景,通俗地說,就是程式設計師可能建立了一個物件,以後一直不再使用這個物件,這個物件卻一直被引用,即這個物件無用但是卻無法被垃圾回收器回收的,這就是Java中可能出現記憶體洩露的情況,例如,快取系統,我們載入了一個物件放在快取中(例如放在一個全域性map物件中),然後一直不再使用它,這個物件一直被快取引用,但卻不再被使用。

檢查java中的記憶體洩露,一定要讓程式將各種分支情況都完整執行到程式結束,然後看某個物件是否被使用過,如果沒有,則才能判定這個物件屬於記憶體洩露。

如果一個外部類的例項物件的方法返回了一個內部類的例項物件,這個內部類物件被長期引用了,即使那個外部類例項物件不再被使用,但由於內部類持久外部類的例項物件,這個外部類物件將不會被垃圾回收,這也會造成記憶體洩露。

2、當一個物件被儲存進HashSet集合中以後,就不能修改這個物件中的那些參與計算雜湊值的欄位了,否則,物件修改後的雜湊值與最初儲存進HashSet集合中時的雜湊值就不同了,在這種情況下,即使在contains方法使用該物件的當前引用作為的引數去HashSet集合中檢索物件,也將返回找不到物件的結果,這也會導致無法從HashSet集合中單獨刪除當前物件,造成記憶體洩露