1.內(nèi)部類(lèi)造成的內(nèi)存泄露。
Activity對(duì)象是存在堆內(nèi)存中的,而內(nèi)部類(lèi)靜態(tài)實(shí)例是存放在方法區(qū)中,GC機(jī)制是回收
堆內(nèi)存,所以,如回收不了被內(nèi)部類(lèi)靜態(tài)實(shí)例持有的堆內(nèi)存。
內(nèi)部類(lèi)在編譯時(shí),會(huì)生成與外部類(lèi)的持有資源,這樣就內(nèi)部類(lèi)就持有外部類(lèi)。
可通過(guò)靜態(tài)內(nèi)部類(lèi)解決上面的問(wèn)題,靜態(tài)內(nèi)部類(lèi)不持有外部類(lèi)的資源,這也就是為什么靜態(tài)內(nèi)部類(lèi)不能調(diào)用外部類(lèi)的資源。
2.單例造成的內(nèi)存泄露
如果單例持有的context,是activity的context,而單例是靜態(tài)的,所以他的生命周期是跟application同樣的,所以持有activity
的context,或其他資源,會(huì)讓activity無(wú)法被回收。
3.Handler造成的內(nèi)存泄露
當(dāng)MainActivity結(jié)束時(shí),未處理的消息持有handler的引用,而handler又持有它所屬的外部類(lèi)也就是 MainActivity的引用。這條引用關(guān)系會(huì)一直保持直
到消息得到處理,這樣阻止了MainActivity被垃圾回收器回收,從而造成了內(nèi)存泄漏。
解決方法,可將handler修改成靜態(tài)內(nèi)部類(lèi),并加上弱引用
4.資源未關(guān)閉造成的內(nèi)存泄漏
對(duì)于使用了BraodcastReceiver,ContentObserver,F(xiàn)ile,Cursor,Stream,Bitmap等資源,應(yīng)該在Activity銷(xiāo)毀時(shí)及時(shí)關(guān)閉或者注銷(xiāo),否則這些資源將不會(huì)被回收,從而造成內(nèi)存泄漏。
5.線程造成的內(nèi)存泄漏
AsyncTask和Runnable都使用了匿名內(nèi)部類(lèi),那么它們將持有其所在Activity的隱式引用。如果任務(wù)在Activity銷(xiāo)毀之前還未完成,那么將導(dǎo)致Activity的內(nèi)存資源無(wú)法被回收,從而造成內(nèi)存泄漏。
可修改成靜態(tài)內(nèi)部類(lèi)。
6.一些框架資源的使用習(xí)慣,沒(méi)有及時(shí)回收,應(yīng)該在周期內(nèi)進(jìn)行釋放
7.集合類(lèi)泄漏,集合如果只有添加機(jī)制,沒(méi)有刪除的處理,極其容易造成內(nèi)存泄露