什么是內(nèi)存泄漏
對象已經(jīng)沒有被應用程序使用宠漩,但是垃圾回收器沒辦法移除它們蚂踊,因為還在被引用著。
內(nèi)存泄漏原因
- 全局集合碗啄。(周期性清除作業(yè))
- 特別注意事件監(jiān)聽和回調(diào)函數(shù)质和。不用的時候,要釋放掉稚字。
- 通常一些成員變量引用其他對象饲宿,初始化的時候需要置空。
- 緩存胆描。(使用java.lang.ref.SoftReference類堅持將對象放入緩存瘫想。這個方法可以保證當虛擬機用完內(nèi)存或者需要更多堆的時候,可以釋放這些對象的引用昌讲。)
- 當集合里面的對象屬性被修改后国夜,再調(diào)用remove()方法時不起作用。
- 各種連接短绸。(數(shù)據(jù)庫連接车吹,網(wǎng)絡連接,IO連接)醋闭,除非調(diào)用其close() 將其連接關閉窄驹,否則是不會自動被GC回收的。
- 內(nèi)部類和外部模塊等的引用证逻。
- 不正確的單例模式乐埠。即:如果單例對象持有外部對象的引用,那么這個外部對象將不能被jvm正城羝螅回收丈咐,導致內(nèi)存泄露。
SoftReference & WeakReference
如果一個對象只具有軟引用洞拨,則內(nèi)存空間足夠扯罐,垃圾回收器就不會回收它;如果內(nèi)存空間不足了烦衣,就會回收這些對象的內(nèi)存歹河。只要垃圾回收器沒有回收它掩浙,該對象就可以被程序使用。軟引用可用來實現(xiàn)內(nèi)存敏感的高速緩存.
弱引用與軟引用的區(qū)別在于:只具有弱引用的對象擁有更短暫的生命周期秸歧。在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過程中厨姚,一旦發(fā)現(xiàn)了只具有弱引用的對象,不管當前內(nèi)存空間足夠與否键菱,都會回收它的內(nèi)存谬墙。不過,由于垃圾回收器是一個優(yōu)先級很低的線程经备,因此不一定會很快發(fā)現(xiàn)那些只具有弱引用的對象拭抬。