android記憶體流失

來源:互聯網
上載者:User

標籤:線程池   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記憶體流失

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.