關(guān)于內(nèi)存泄漏的一些思考

今天是我注冊簡書的第一天斥黑,我是一個Android程序員揖盘。剛開始做這一行時就有很多前輩和我說,作為一個技術(shù)人員要堅持每天寫博客锌奴,把自己工作中遇到的問題記下來兽狭。我曾經(jīng)也在其他平臺寫過幾篇,但都沒有堅持下去鹿蜀。最近在工作中遇到的一些事情讓我覺得很難過箕慧,在和同事討論一個技術(shù)方案時發(fā)現(xiàn)在表達(dá)自己的觀點(diǎn)時邏輯混亂,總是無法讓同事理解我的想法茴恰。我曾經(jīng)一度以為是同事的理解能力差颠焦,直到我遇到好幾次這樣的事情,才讓我不得不思考是不是我自己的問題往枣?越在職場中混跡越讓我覺得表達(dá)自己的觀點(diǎn)并且讓別人理解是一種很重要的能力伐庭。為此我決定從今天開始重新開始寫博客,既可以把自己在工作中遇到的事情記錄下來分冈,又可以鍛煉自己的表達(dá)能力圾另,如果同時能對別人有幫助就再好不過了。現(xiàn)在開始進(jìn)入主題吧雕沉。

今天先來說說我關(guān)于內(nèi)存泄漏的看法盯捌,在網(wǎng)上有很多介紹避免內(nèi)存泄漏的方法,這里就不在贅述了蘑秽。我想說的是饺著,如果在我們的app中不幸發(fā)生了內(nèi)存泄漏該怎么辦呢箫攀?有沒有什么辦法補(bǔ)救呢?隨著業(yè)務(wù)越來越復(fù)雜幼衰,代碼越來越多靴跛,以及人員的更替,哪怕編程過程中再仔細(xì)渡嚣,靜態(tài)代碼檢查再嚴(yán)格梢睛,也總是有落網(wǎng)之魚的。

在debug的App中絕大多數(shù)App都會使用LeakCanary來檢測內(nèi)存泄漏识椰,它的實(shí)現(xiàn)原理是監(jiān)聽activity的生命周期,在activity的onDestory方法中創(chuàng)建一個虛引用指向這個activity對象藏畅。五分鐘過后通過虛引用的get方法判斷activity對象有沒有被銷毀掉功咒,如果沒有被銷毀手動觸發(fā)gc,再用同樣的方式判斷一下榜旦,如果還是沒有被銷毀就dump memory景殷,并且發(fā)送內(nèi)存泄漏通知。在我們的正式版的app中是否也可以用這種方試來監(jiān)聽內(nèi)存泄漏呢猿挚?在發(fā)生內(nèi)存泄漏時做點(diǎn)什么,讓內(nèi)存泄漏的造成的代價最小。對于一個activity而言最占用內(nèi)存的部分就是它持有的view對象梁厉,因?yàn)関iew對象中可能包含很多圖片作為背景或者其他的。還有就是業(yè)務(wù)相關(guān)的對象八秃。那么在監(jiān)聽到某個activity發(fā)生內(nèi)存泄漏后我們就可以釋放activity持有的view對象以及其他的對象肉盹。可以通過反射骤肛,也可以通過創(chuàng)建一個接口,里面包含一個trimMemory之類的方法用于在發(fā)生內(nèi)存泄漏時釋放activity引用的對象腋颠。簡單實(shí)現(xiàn)如下

MemoryLeak.kt

 class MemoryLeakAppliction : Application() {
    private val mHandler = Handler(Looper.getMainLooper())

    override fun onCreate() {
        super.onCreate()
        registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
            override fun onActivityPaused(p0: Activity) {
            }

            override fun onActivityStarted(p0: Activity) {
            }

            override fun onActivityDestroyed(p0: Activity) {
                val activityReference = WeakReference(p0)
                mHandler.postDelayed({
                    Looper.myQueue().addIdleHandler {
                        if (activityReference.get() == null) {
                            Log.i(TAG, "good!!! has not memory leak")
                            return@addIdleHandler false
                        }
                        Log.i(TAG, "may be memory leak!!, gc and check 3 seconds latter")
                        System.gc()
                        mHandler.postDelayed({
                            val activity = activityReference.get()
                            if (activity != null) {
                                Log.w(TAG, "memory leak!!! activity = ${activity.javaClass.name}")
                                if (activity is MemoryLeakCallbck) {
                                    activity.onMemoryLeak()
                                }
                            }
                        }, 3 * 1000)
                        return@addIdleHandler false
                    }
                }, 5 * 60 * 1000)
            }

            override fun onActivitySaveInstanceState(p0: Activity, p1: Bundle) {
            }

            override fun onActivityStopped(p0: Activity) {
            }

            override fun onActivityCreated(p0: Activity, p1: Bundle?) {
            }

            override fun onActivityResumed(p0: Activity) {
            }
        })
    }
}

interface MemoryLeakCallbck {
    fun onMemoryLeak()
}

MemoryLeakTestActivity.kt

package com.example.firstapp

import androidx.appcompat.app.AppCompatActivity

class MemoryLeakTestActivity: AppCompatActivity(), MemoryLeakCallbck {
    override fun onMemoryLeak() {
        //如果發(fā)生內(nèi)存泄漏巾腕,釋放activity引用的對象
        setContentView(null)
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尊搬,一起剝皮案震驚了整個濱河市土涝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狗准,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腔长,死亡現(xiàn)場離奇詭異捞附,居然都是意外死亡您没,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門欧募,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仆抵,“玉大人,你說我怎么就攤上這事舔糖。” “怎么了金吗?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵摇庙,是天一觀的道長。 經(jīng)常有香客問我异袄,道長,這世上最難降的妖魔是什么烤蜕? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任讽营,我火速辦了婚禮,結(jié)果婚禮上橱鹏,老公的妹妹穿的比我還像新娘堪藐。我一直安慰自己,他們只是感情好糖荒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布模捂。 她就那樣靜靜地躺著,像睡著了一般综看。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上红碑,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天析珊,我揣著相機(jī)與錄音兔毙,去河邊找鬼兄春。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祭饭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼倡蝙,長吁一口氣:“原來是場噩夢啊……” “哼寺鸥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胆建,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤笆载,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凉驻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體复罐,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年缀拭,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛛淋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡褐荷,死狀恐怖叛甫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情其监,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布抖苦,位于F島的核電站锌历,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏究西。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一遮斥、第九天 我趴在偏房一處隱蔽的房頂上張望扇丛。 院中可真熱鬧,春花似錦晕拆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽末贾。三九已至整吆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間表蝙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工集索, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汇跨,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓函匕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盅惜。 傳聞我的和親對象是個殘疾皇子吸耿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

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