1 單例的靜態(tài)特性生命周期跟應(yīng)用的生命周期一樣長(zhǎng)敏沉,一個(gè)場(chǎng)景(Context)不需要使用,那么會(huì)導(dǎo)致這個(gè)Context無(wú)法回收
? 解決(private Context context贸毕;本方法內(nèi) set())
2 非靜態(tài)內(nèi)部類(lèi) 的 靜態(tài)實(shí)例 (解決:把該內(nèi)部類(lèi)設(shè)為靜態(tài)內(nèi)部類(lèi))
? 非靜態(tài)內(nèi)部類(lèi)持有外部類(lèi)的引用 容易導(dǎo)致內(nèi)存泄漏
3 Handler 造成的內(nèi)存泄漏,Handler 向 looper的MessageQueue()發(fā)的Message 都會(huì)持有外部類(lèi)的引用.
? 當(dāng)有未完成的消息夜赵,但是外部類(lèi)已經(jīng)銷(xiāo)毀明棍,而looper又是系統(tǒng)級(jí)周期,導(dǎo)致無(wú)法回收這個(gè)外部類(lèi)油吭,造成內(nèi)存泄漏击蹲。
? (解決辦法:使用靜態(tài)內(nèi)部類(lèi)創(chuàng)建Handler(靜態(tài)內(nèi)部類(lèi)不會(huì)持有外部類(lèi)的引用),可以使用弱引用管理Handler)
4 與Handler類(lèi)似的還有 AsyncTask 和 Runnable 同上
5 使用BroadCastRecevicer ContextObserver File Cursur Stream BitMap()等未關(guān)閉或者注銷(xiāo)婉宰。
? Cursur File Stream 等一般都會(huì)設(shè)置一些緩存機(jī)制歌豺,所以要先關(guān)閉,后退出心包。
6 使用ListView 構(gòu)建BaseAdapter的時(shí)候 沒(méi)有利用 ConvertView(一般現(xiàn)在用RecyclerView)
7 容器(ArrayList等) 把一些對(duì)象的引用添加到集合类咧,但Activity結(jié)束,沒(méi)有Clear,并且置空痕惋。
8 WebView(銷(xiāo)毀時(shí)釋放內(nèi)存)
9 一些靜態(tài)集合傳入一些類(lèi)實(shí)例對(duì)象
思考(避免內(nèi)存溢出):
? 1 生命周期的對(duì)比 Context 場(chǎng)景的引用 比如 showDialog 就需要 Activity 的 Context区宇,創(chuàng)建一個(gè)單例就需要 Applaction的Context。
? 2 靜態(tài)內(nèi)部類(lèi)需要使用外部類(lèi)的成員值戳,使用弱引用來(lái)管理外部成員(Context View)议谷。
? 3 內(nèi)部類(lèi)的使用,可以考慮使用靜態(tài)內(nèi)部類(lèi)堕虹,使用弱引用來(lái)管理外部類(lèi)的成員變量卧晓。