Android内存优化之内存泄漏
內(nèi)存泄漏
內(nèi)存泄漏一般有以下幾種情況:單例、靜態(tài)變量、Handler、匿名內(nèi)部類、資源使用未關(guān)閉
單例導(dǎo)致的內(nèi)存泄漏
單例的情況主要是因為單例的生命周期比較長,如果引用的一些資源(比如Context、圖片等)沒有做特殊處理,就容易導(dǎo)致內(nèi)存泄漏。具體的分析可以查看文章:Android 單例模式的正確姿勢
靜態(tài)變量導(dǎo)致的內(nèi)存泄漏
靜態(tài)變量的生命周期同樣很長,如果引用了一些資源沒有及時釋放的話就會導(dǎo)致內(nèi)存泄漏,比如Context、圖片的引用等。
引用圖片資源,這樣寫就要小心了。
private static LinkedHashMap<String, Bitmap> mapPool; 復(fù)制代碼引用的是Context,比如Activity。
public class MyActivity extends AppCompatActivity {private static MyClass myClass;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (myClass == null) {myClass = new MyClass(this);}}class MyClass {MyClass(Activity activity) {}} } 復(fù)制代碼Activity退出后myClass仍然持有Activity的引用導(dǎo)致Activity無法被回收。
Handler導(dǎo)致的內(nèi)存泄漏
Handler導(dǎo)致的內(nèi)存泄漏需要先充分理解Android的消息機(jī)制,其中跟內(nèi)存泄漏有關(guān)的一個點就是消息Message會持有Handler引用,這樣的話如果消息隊列中有消息還沒有處理完的話,Handler就無法釋放,這個時候如果Handler里面還引用了Activity或是其他資源,那就會導(dǎo)致內(nèi)存泄漏。
一種情況是Handler是內(nèi)部類,由于內(nèi)部類會默認(rèn)引用外部類,這時候如果外部是Activity等,就可能造成內(nèi)存泄漏
public class MainActivity extends AppCompatActivity {private static LinkedHashMap<String, Bitmap> mapPool;private class MyHandler extends Handler {@Overridepublic void handleMessage(Message message) {}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}} 復(fù)制代碼解決方式也簡單,就是將Handler定義為靜態(tài)內(nèi)部類。當(dāng)然如果Handler里面還顯示引用了Context或是View等資源,最好用弱引用。
匿名內(nèi)部類
匿名內(nèi)部類導(dǎo)致的內(nèi)存泄漏原因是匿名內(nèi)部類會默認(rèn)引用外部類,如果外部類是Activity等資源型類的話就會導(dǎo)致內(nèi)存泄漏。所以你看我們通過自動工具生成的一些類,比如我們用GsonFormat生成的實體Bean,內(nèi)部類都是靜態(tài)的。
資源使用未關(guān)閉
資源使用未關(guān)閉這個比較好理解,常見的資源類型有廣播BraodcastReceiver、ContentObserver、File、數(shù)據(jù)庫游標(biāo)Cursor、以及Stream和Bitmap。在使用這些資源時我們就需要注意在不使用的時候需要及時釋放這些資源。
系統(tǒng)bug導(dǎo)致的內(nèi)存泄漏
這種情況不用檢測工具很難發(fā)現(xiàn),比如LeakCanary。這里就記錄一個InputMethodManager導(dǎo)致的內(nèi)存泄漏。具體情形和解決方法可以查看文章:Android InputMethodManager內(nèi)存泄漏 解決方法總結(jié)
感謝塵封的落葉的提醒。
歡迎關(guān)注我的微信公眾號,和我一起每天進(jìn)步一點點! 復(fù)制代碼
總結(jié)
以上是生活随笔為你收集整理的Android内存优化之内存泄漏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: http协议与php关系,PHP中的HT
- 下一篇: [Android] 年年有鱼手机主题