每日一問:Android 中內(nèi)存泄漏都有哪些注意點采郎?

別忘了常來我的 GitHub 看看,有什么好玩的~

內(nèi)存泄漏對每一位 Android 開發(fā)一定是司空見慣狂魔,大家或多或少都肯定有些許接觸蒜埋。大家都知道,每一個手機都有一定的承載上限最楷,多處的內(nèi)存泄漏堆積一定會堆積如山整份,最終出現(xiàn)內(nèi)存爆炸 OOM。

而這籽孙,也是極有可能在 Android 面試中一道常見的開放題皂林。

內(nèi)存泄漏的根本原因是一個長生命周期的對象持有了一個短生命周期的對象。如果你對垃圾回收機制有所了解蚯撩,我想這個問題基本難不住你,因為知道了原理烛占,自然不會去觸碰這些極易導(dǎo)致內(nèi)存泄漏的雷區(qū)胎挎。

該題重在積累,不需要死記硬背忆家,自己多總結(jié)即可犹菇。

1. 長生命周期對象持有 Activity

這基本是最常見的內(nèi)存泄漏了,比如

  • 內(nèi)部類形式使用 Handler 同時發(fā)送延時消息芽卿,或者在 Handler 里面執(zhí)行耗時任務(wù)揭芍,在任務(wù)還沒完成的時候 Activity 需要銷毀。這時候由于 Handler 持有 Activity 的強引用導(dǎo)致 Activity 無法被回收卸例。
  • 同理內(nèi)部類形式的使用 AsyncTask 執(zhí)行耗時任務(wù)也會導(dǎo)致內(nèi)存泄漏的發(fā)生称杨。
  • 單例作為最長生命周期的對象,自然不應(yīng)該持有 Activity 從而導(dǎo)致內(nèi)存泄漏發(fā)生筷转;

針對上面這種情況姑原,基本不必多說了,不要使用內(nèi)部類或者匿名內(nèi)部類做這樣的處理就好了呜舒,實際上 IDE 也會彈出警告锭汛,我想大家應(yīng)該還是都知道采用靜態(tài)內(nèi)部類或者在銷毀頁面的時候使用相關(guān)方法移除處理的。實際上,使用 Kotlin 或者 Java 8 的 Lambda 表達(dá)式同樣不會導(dǎo)致內(nèi)存泄漏的發(fā)生唤殴,這是因為實際上它也是使用的靜態(tài)內(nèi)部類般婆,沒有持有外部引用。

Activity 中匿名使用 Handler 實際上會導(dǎo)致 Handler 內(nèi)部類持有外部類的引用朵逝,而 SendMessage() 的時候 Message 會持有 Handler蔚袍,enqueueMessage 機制又會導(dǎo)致 MeassageQueue 持有 Message。所以當(dāng)發(fā)送的是延遲消息那么 Message 并不會立即的遍歷出來處理而是阻塞到對應(yīng)的 Message 觸發(fā)時間以后再處理廉侧。那么阻塞的這段時間中頁面銷毀一定會造成內(nèi)存泄漏页响。

2. 各種注冊操作沒有對應(yīng)的反注冊

這一點基本不必多說,相信大家剛剛開始學(xué)習(xí)廣播和 Service 的時候一定對此有所接觸段誊,然后就是比如我們常用的第三方框架 EventBus 也是一樣的闰蚕。平時使用的時候注意在對應(yīng)的生命周期方法中進(jìn)行反注冊。

3. Bitmap 使用完沒有注意 recycle()

Bitmap 作為大對象连舍,在使用完畢一定要注意調(diào)用 recycle() 進(jìn)行回收没陡。TypedArrayCursor索赏、各種流同理盼玄,一定要在最后調(diào)用自己的回收關(guān)閉方法處理。

4. WebView 使用不當(dāng)

WebView 是非常常用的控件潜腻,但稍有不注意也會導(dǎo)致內(nèi)存泄漏埃儿。內(nèi)存泄漏的場景: 很多人使用 Webview 都喜歡采用布局引用方式, 這其實也是作為內(nèi)存泄漏的一個隱患。當(dāng) Activity 被關(guān)閉時融涣,Webview 不會被 GC 馬上回收,而是提交給事務(wù)童番,進(jìn)行隊列處理,這樣就造成了內(nèi)存泄漏, 導(dǎo)致 Webview 無法及時回收威鹿。

目前所知的比較安全的方案是:

  • 在布局中動態(tài)添加 WebView剃斧。
  • 采用下面的方法。
override fun onDestroy() {
    webView?.apply {
        val parent = parent
        if (parent is ViewGroup) {
            parent.removeView(this)
        }
        stopLoading()
        // 退出時調(diào)用此方法忽你,移除綁定的服務(wù)幼东,否則某些特定系統(tǒng)會報錯
        settings.javaScriptEnabled = false
        clearHistory()
        removeAllViews()
        destroy()
    }
}

5. 循環(huán)引用

循環(huán)引用導(dǎo)致內(nèi)存泄漏比較少見,正常來講不會有人寫出 A 持有 B科雳,B 持有 C根蟹,C 又持有A 這樣的代碼,不過總還是需要注意糟秘。

總的來說娜亿,內(nèi)存泄漏很常見,但檢測方式也很多蚌堵。我們的 Android Studio 自帶的 Monitors 就可以幫我們找到大部分內(nèi)存問題买决,當(dāng)然我們也可以采用譬如 LeakCanary 這樣的庫去做檢測沛婴。

參見:https://android.jlelse.eu/9-ways-to-avoid-memory-leaks-in-android-b6d81648e35e

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市督赤,隨后出現(xiàn)的幾起案子嘁灯,更是在濱河造成了極大的恐慌,老刑警劉巖躲舌,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丑婿,死亡現(xiàn)場離奇詭異,居然都是意外死亡没卸,警方通過查閱死者的電腦和手機羹奉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來约计,“玉大人诀拭,你說我怎么就攤上這事∶喊觯” “怎么了耕挨?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尉桩。 經(jīng)常有香客問我筒占,道長,這世上最難降的妖魔是什么蜘犁? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任翰苫,我火速辦了婚禮,結(jié)果婚禮上这橙,老公的妹妹穿的比我還像新娘革骨。我一直安慰自己,他們只是感情好析恋,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盛卡,像睡著了一般助隧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滑沧,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天并村,我揣著相機與錄音,去河邊找鬼滓技。 笑死哩牍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的令漂。 我是一名探鬼主播膝昆,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼丸边,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了荚孵?” 一聲冷哼從身側(cè)響起妹窖,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎收叶,沒想到半個月后骄呼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡判没,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年蜓萄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澄峰。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫉沽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摊阀,到底是詐尸還是另有隱情耻蛇,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布胞此,位于F島的核電站臣咖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏漱牵。R本人自食惡果不足惜夺蛇,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酣胀。 院中可真熱鬧刁赦,春花似錦、人聲如沸闻镶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铆农。三九已至牺氨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間墩剖,已是汗流浹背猴凹。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岭皂,地道東北人郊霎。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像爷绘,于是被迫代替她去往敵國和親书劝。 傳聞我的和親對象是個殘疾皇子进倍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容