Android中的內存泄漏情況分析

內存泄漏(memory leak)是指由於疏忽或錯誤造成程序未能釋放已經不再使用的內存。那麼在Android中,當有一個對象持有Activity的引用,如果該對象不能被系統回收,那麼當這個Activity不再使用時,這個Activity也不會被系統回收,那這麼以來便出現了內存泄漏的情況。在應用中內出現一兩次的內存泄漏或許不會出現什麼影響,但是在應用長時間使用以後,若是存在大量的Activity無法被GC回收的話,最終會導致OOM的出現。

常見的內存泄漏
1、非靜態內部類的靜態實例容易造成內存泄漏
2、Activity使用靜態成員
3、非靜態的匿名內部類對象會持有一個外部類的引用
4、使用Handler導致的內存泄漏;
(Handler通過發送Message與其他線程交互,Message發出之後是存儲在目標線程中的MeessageQueue中的,而有時候Message也不是就被處理,可能會駐留比較久的時間。在Message類中存在一個成員變量target,它強引用了handler實例,如果message在queue中一直存在,就會導致handler實例無法被回收,如果handler對應的類是非靜態內部類,則會導致外部類實例不會被回收,這就造成了外部類實例的泄漏。所以正確處理Handler等之類的內部類,應該將自己的Handler定義爲靜態內部類,並且在類中增加一個成員變量,用來弱引用外部類實例。)
5、屬性動畫中有一類無限循環動畫
(如果在Actitvity中播放這類動畫並且在onDestroy中去停止動畫,那麼這個動畫將會一直播放下去,這時候Activtiy會被view所持有,從而導致Activity無法被釋放。解決此類問題則是需要在Activity中onDestroy去調用objectAnimator.cancel()來停止動畫。)
6、註冊某個對象後爲反註冊
7、集合中對象沒清理造成的內存泄漏
8、資源對象未關閉造成的內存泄漏
9、第三方庫使用不當
10、不良代碼造成的內存壓力
10.1 Bitmap使用不當(1、及時的銷燬 ;2、設置一定的採樣率;3、巧妙的運用軟引用;)
10.2構造Adapter時,沒有使用緩存的convertView;
10.3不要在經常調用的方法中創建對象,尤其是忌諱在循環中創建對象。可以適當使用hashtable、vector創建一組對象容器,然後從容器中去取那些對象,而不用每次new之後丟棄。
——-(未完待續)———-

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章