標籤:線程池 ext loop 溢出 sync 一般來說 text get static
其中記憶體流失產生的原因在Android中大致分為以下幾種:
1.static變數引起的記憶體流失
因為static變數的生命週期是在類載入時開始 類卸載時結束,也就是說static變數是在程式進程死亡時才釋放,如果在static變數中 引用了Activity 那麼 這個Activity由於被引用,便會隨static變數的生命週期一樣,一直無法被釋放,造成記憶體流失。
解決辦法:
在Activity被靜態變數引用時,使用 getApplicationContext 因為Application生命週期從程式開始到結束,和static變數的一樣。
2.線程造成的記憶體流失
類似於上述例子中的情況,線程執行時間很長,及時Activity跳出還會執行,因為線程或者Runnable是Acticvity內部類,因此握有Activity的執行個體(因為建立內部類必須依靠外部類),因此造成Activity無法釋放。
AsyncTask 有線程池,問題更嚴重
解決辦法:
1.合理安排線程執行的時間,控制線程在Activity結束前結束。
2.將內部類改為靜態內部類,並使用弱引用WeakReference來儲存Activity執行個體 因為弱引用 只要GC發現了 就會回收它 ,因此可儘快回收
3.BitMap佔用過多記憶體
bitmap的解析需要佔用記憶體,但是記憶體只提供8M的空間給BitMap,如果圖片過多,並且沒有及時 recycle bitmap 那麼就會造成記憶體溢出。
解決辦法:
及時recycle 壓縮圖片之後載入圖片
4.資源未被及時關閉造成的記憶體流失
比如一些Cursor 沒有及時close 會儲存有Activity的引用,導致記憶體流失
解決辦法:
在onDestory方法中及時 close即可
5.Handler的使用造成的記憶體流失
由於在Handler的使用中,handler會發送message對象到 MessageQueue中 然後 Looper會輪詢MessageQueue 然後取出Message執行,但是如果一個Message長時間沒被取出執行,那麼由於 Message中有 Handler的引用,而 Handler 一般來說也是內部類對象,Message引用 Handler ,Handler引用 Activity 這樣 使得 Activity無法回收。
解決辦法:
依舊使用 靜態內部類+弱引用的方式 可解決
其中還有一些關於 集合對象沒移除,註冊的對象沒反註冊,代碼壓力的問題也可能產生記憶體流失,但是使用上述的幾種解決辦法一般都是可以解決的。
android記憶體流失