很久沒有進cnblogs了,都快長草了.以前對接某度要求我司的插件 monkey test滿8小時無OOM 無crash 虐哭了...各類OOM 下面把當時寫的一篇筆記po上來防止長草.java
1.什麼是OOM,爲何會有OOMandroid
Android主要應用在嵌入式設備中,因此由於嵌入式設備自己的一些限制,一般內存都會比較有限.JAVA擁有本身的一套垃圾回收機制,但並非說用java編寫的程序就不會程序溢出.java運行在虛擬機中,虛擬機在初始化時會給它的對內存(Heap)設置一個上限值,android中這個上限值通常是16m.當由於代碼缺陷致使內存泄露,泄露的內存被一些數據對象佔用着,沒法經過GC去回收釋放,最終就會致使OOM.git
2.怎樣檢查項目中是否有OOM問題數據庫
要檢查項目中是否有OOM問題,能夠藉助eclipse中的DDMS和MAT去分析觀察內存.咱們能夠這樣作:eclipse
1)把手機的開發者選項模式打開並用數據線鏈接電腦(廢話)工具
2)打開eclipse切換到DDMS視圖以下圖測試
3)擊選中 Devices 視圖界面中最上方一排圖標中的「Update Heap」圖標:插件
接着手機進入應用要測試排查是否有泄露的activity或者fragment,以後在DDMS右邊的視圖點擊一下Cause GC,讓虛擬機強制GC一次,以後就不用點了,它會自動刷新視圖(點擊之後可能會卡住一段時間這屬於正常的).而後觀察GC後的data ovhect的 Total size和Count.嘗試關閉當前頁面並從新進入,反覆進行如此操做後看Count和Total size在GC後會不會有明顯回落接近以前GC後的值,若是屢次操做GC後內存呈現較大的增長趨勢那麼,這個頁面可能會有問題!!server
或者也能夠嘗試使用MAT內存分析工具去分析內存泄露的緣由,我功力尚淺只是淺嘗即止有興趣能夠根據這篇教程去看對象
http://rayleeya.iteye.com/blog/1956638
3.怎樣去解決OOM
我所碰到的OOM問題暫時就這三種狀況
1)在一些單例的構造方法中須要傳入一個context,傳入了activity的context,致使單例持有這個activity的引用不能讓其回收.
例如操做數據庫的UserDatabase類,它是單例的主要用來打開關閉數據庫存放數據,咱們項目中以前寫得人忽略了這一點,傳入的context是acitivity的,由於單例的生命週期和整個程序的生命週期同樣長,建議直接使用Application的context.
2)靜態的成員變量
有時由於一些緣由(好比但願節省Activity初始化時間等),將一些對象設置爲static的,咱們會忘了在activity退出的時候把這些變量的引用給釋放,因此致使和這個變量相關的Activity強引用的其餘對象也沒法被釋放,這樣就形成了內存泄露.建議在onDestroy方法中把這些static的變量給置爲null;
3)註冊/取消監聽對象
常常要用到一些XxxListener對象,或者是XxxObserver、XxxReceiver對象,而後用registerXxx方法註冊,用unregisterXxx方法註銷。自己用法也很簡單,可是從一些實際開發中的代碼來看,仍然會有一些問題: registerXxx和unregisterXxx方法的調用一般也和Cursor的打開/關閉相似,在Activity的生命週期中成對的出現便可:
在 onCreate() 中 register,在 onDestroy() 中 unregitster;
在 onStart() 中 register,在 onStop() 中 unregitster;
在 onResume() 中 register,在 onPause() 中 unregitster;
最近碰到的問題,在fragment中定義了一個PhoneStateListener的對象,將其註冊到TelephonyManager中:
TelephonyManager.listen(l,PhoneStateListener.LISTEN_SERVICE_STATE);
可是在Activity退出的時候註銷掉這個監聽,即沒有調用如下方法:
TelephonyManager.listen(l,PhoneStateListener.LISTEN_NONE);
由於PhoneStateListener的成員變量callback,被註冊到了TelephonyRegistry中,TelephonyRegistry是後臺的一個服務會一直運行着。因此若是不註銷,則callback對象沒法被釋放,PhoneStateListener對象也就沒法被釋放,最終致使Activity對象沒法被釋放
參考資料:
http://rayleeya.iteye.com/blog/1956059