內存泄漏可能是有單例、非靜態內部類創建靜態實例、Handle等造成的,它的解決辦法具體如下:
一、內存泄漏的原因
1、單例造成的內存泄漏
由于單例的靜態特性使得其生命周期和應用的生命周期一樣長,如果一個對象已經不再需要使用了,而單例對象還持有該對象的引用,就會使得該對象不能被正常回收,從而導致了內存泄漏。
2、非靜態內部類創建靜態實例造成的內存泄漏
例如,有時候可能會在啟動頻繁的Activity中,為了避免重復創建相同的數據資源,可能會出現如下寫法:
3、Handler造成的內存泄漏
示例:創建匿名內部類的靜態對象。
二、內存泄漏的解決辦法
1、盡量減少使用靜態變量,或者使用完及時賦值為null。
2、明確內存對象的有效作用域,盡量縮小對象的作用域,能用局部變量處理的不用成員變量,因為局部變量彈棧會自動回收。
3、減少長生命周期的對象持有短生命周期的引用。
4、使用StringBuilder和StringBuffer進行字符串連接,Sting和StringBuilder以及StringBuffer等都可以代表字符串,其中String字符串代表的是不可變的字符串,后兩者表示可變的字符串。如果使用多個String對象進行字符串連接運算,在運行時可能產生大量臨時字符串,這些字符串會保存在內存中從而導致程序性能下降。
5、對于不需要使用的對象手動設置null值,不管GC何時會開始清理,我們都應及時的將無用的對象標記為可被清理的對象。
6、各種連接(數據庫連接,網絡連接,IO連接)操作,務必顯示調用close關閉。