http://www.maiziedu.com/article/9126/
Android中分析內(nèi)存泄漏的工具M(jìn)AT
MAT(Memory Analyzer Tools)是一個 Eclipse 插件溪掀,它是一個快速缸废、功能豐富的JAVA heap分析工具滑绒,它可以幫助我們查找內(nèi)存泄漏和減少內(nèi)存消耗。
常見的內(nèi)存泄漏案例
case 1.單例造成的內(nèi)存泄漏跃闹,單例的靜態(tài)特性導(dǎo)致其生命周期同應(yīng)用一樣長凶杖。
解決方案:
1.將該屬性的引用方式改為弱引用
2.如果傳入context草丧,使用ApplicationContext
case 2.InnerClass匿名內(nèi)部類
在Java中盆耽,非靜態(tài)內(nèi)部類 和 匿名類 都會潛在的引用它們所屬的外部類腋寨,但是聪铺,靜態(tài)內(nèi)部類卻不會。如果這個非靜態(tài)內(nèi)部類實(shí)例做了一些耗時的操作萄窜,就會造成外圍對象不會被回收铃剔,從而導(dǎo)致內(nèi)存泄漏。
解決方案:
1.將內(nèi)部類變成靜態(tài)內(nèi)部類
2.如果有強(qiáng)引用Activity中的屬性查刻,則將該屬性的引用方式改為弱引用
case 3. Activity Context 的不正確使用
在Android應(yīng)用程序中通臣担可以使用兩種Context對象:Activity和Application。當(dāng)類或方法需要Context對象的時候常見的做法是使用第一個作為Context參數(shù)穗泵。這樣就意味著View對象對整個Activity保持引用普气,因此也就保持對Activty的所有的引用。
假設(shè)一個場景佃延,當(dāng)應(yīng)用程序有個比較大的Bitmap類型的圖片现诀,每次旋轉(zhuǎn)是都重新加載圖片所用的時間較多。為了提高屏幕旋轉(zhuǎn)是Activity的創(chuàng)建速度苇侵,最簡單的方法時將這個Bitmap對象使用Static修飾赶盔。 當(dāng)一個Drawable綁定在View上,實(shí)際上這個View對象就會成為這份Drawable的一個Callback成員變量榆浓。而靜態(tài)變量的生命周期要長于Activity于未。導(dǎo)致了當(dāng)旋轉(zhuǎn)屏幕時,Activity無法被回收陡鹃,而造成內(nèi)存泄露烘浦。
解決方案:
1.使用ApplicationContext代替ActivityContext,因?yàn)锳pplicationContext會隨著應(yīng)用程序的存在而存在萍鲸,而不依賴activity的生命周期
2.對context的引用不要超過它本身的生命周期
case 4. Handler引起的內(nèi)存泄漏
當(dāng)Handler中有延遲的的任務(wù)或是等待執(zhí)行的任務(wù)隊(duì)列過長闷叉,由于消息持有對Handler的引用,而Handler又持有對其外部類的潛在引用脊阴,這條引用關(guān)系會一直保持到消息得到處理握侧,而導(dǎo)致了Activity無法被垃圾回收器回收蚯瞧,而導(dǎo)致了內(nèi)存泄露。
解決方案:
1.可以把Handler類放在單獨(dú)的類文件中品擎,或者使用靜態(tài)內(nèi)部類便可以避免泄露;
2.如果想在Handler內(nèi)部去調(diào)用所在的Activity,那么可以在handler內(nèi)部使用弱引用的方式去指向所在Activity.使用Static + WeakReference的方式來達(dá)到斷開Handler與Activity之間存在引用關(guān)系的目的埋合。
case5. 未及時關(guān)閉比較耗資源的對象。比如database conn萄传,serivce甚颂。