說說 內(nèi)存泄漏

內(nèi)存泄漏和內(nèi)存溢出是兩個概念格侯。
內(nèi)存泄漏鼻听,指的是程序使用過的內(nèi)存“忘記”歸還給系統(tǒng)财著,造成長時間無謂地占用。
內(nèi)存溢出撑碴,指的是內(nèi)存被大量的使用后撑教,程序再次去申請內(nèi)存時,系統(tǒng)已經(jīng)不能滿足其要求的情況醉拓。
所以伟姐,內(nèi)存泄露到一定程度就會導(dǎo)致內(nèi)存溢出。

Java中亿卤,內(nèi)存的回收工作是GC來做的愤兵。GC也有軟肋:如果持有對象的強(qiáng)引用,GC是無法在內(nèi)存中回收這個對象的排吴。

繞個遠(yuǎn)說說幾種引用:

  • 強(qiáng)引用(StrongReference)
    強(qiáng)引用是使用最普遍的引用秆乳。如果一個對象具有強(qiáng)引用,那垃圾回收器絕不會回收它钻哩。當(dāng)內(nèi)存空間不足矫夷,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯誤,使程序異常終止憋槐,也不會靠隨意回收具有強(qiáng)引用的對象來解決內(nèi)存不足的問題双藕。
  • 軟引用(SoftReference)
    如果一個對象只具有軟引用,則內(nèi)存空間足夠阳仔,垃圾回收器就不會回收它忧陪;如果內(nèi)存空間不足了,就會回收這些對象的內(nèi)存近范。
  • 弱引用(WeakReference)
    GC掃描過程中嘶摊,一旦發(fā)現(xiàn)了只具有弱引用的對象,不管當(dāng)前內(nèi)存空間足夠與否评矩,都會回收它的內(nèi)存叶堆。
  • 虛引用(PhantomReference)
    如果一個對象僅持有虛引用,那么它就和沒有任何引用一樣斥杜,在任何時候都可能被垃圾回收器回收虱颗。

列舉經(jīng)常造成內(nèi)存泄漏的幾種情況:

  1. static變量
  • static activity
public class MyActivity extends BaseActivity {
    static Activity mActivity = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivity = this;
    }
}

通常,一個activity對象包含了大量的引用蔗喂,如果賦值給一個靜態(tài)變量會使activity脫離系統(tǒng)的管理忘渔。被泄漏的activity對象會一直存活在內(nèi)存中,造成內(nèi)存泄漏缰儿。

  • static view
public class MyActivity extends BaseActivity {
    static TextView textView = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        textView = new TextView(this);
    }
}
  1. 內(nèi)部類
    內(nèi)部類使用起來是比較便捷的畦粮,但就是這么一點福利也要冒著內(nèi)存泄漏的風(fēng)險,因為非靜態(tài)的內(nèi)部類會持有外部類的一個隱式引用。
  • Thread
public class MyActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        doSth();
    }

    private void doSth() {
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    SystemClock.sleep(1000);
                }
            }
        }.start();
    }
}

假如新線程執(zhí)行的任務(wù)非常耗時宣赔,十天半個月都做不完预麸。在此期間,外部類對象也不能被回收儒将。TimerTask和AsyncTask也會有同樣的問題师崎。

  • Handler
public class MyActivity extends BaseActivity {

    Handler mHanlder = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        doSth();
    }

    private void doSth() {
        mHanlder.postDelayed(new Runnable() {
            @Override
            public void run() {

            }
        }, Long.MAX_VALUE >> 1);
    }
}

Runnable會持有外部類引用,造成內(nèi)存泄漏椅棺。

  1. Sensor Manager
    通過Context.getSystemService(int name)可以獲取系統(tǒng)服務(wù)。這些服務(wù)工作在各自的進(jìn)程中齐蔽,幫助應(yīng)用處理后臺任務(wù)两疚,處理硬件交互。如果需要使用這些服務(wù)含滴,可以注冊監(jiān)聽器诱渤,這會導(dǎo)致服務(wù)持有了Context的引用,如果在Activity銷毀的時候沒有注銷這些監(jiān)聽器谈况,會導(dǎo)致內(nèi)存泄漏勺美。
public class MyActivity extends BaseActivity implements SensorEventListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        registerListener();

    }

    void registerListener() {
        SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ALL);
        sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}

恩,就醬碑韵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赡茸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祝闻,更是在濱河造成了極大的恐慌占卧,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件联喘,死亡現(xiàn)場離奇詭異华蜒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)豁遭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門叭喜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蓖谢,你說我怎么就攤上這事捂蕴。” “怎么了闪幽?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵启绰,是天一觀的道長。 經(jīng)常有香客問我沟使,道長委可,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮着倾,結(jié)果婚禮上拾酝,老公的妹妹穿的比我還像新娘。我一直安慰自己卡者,他們只是感情好蒿囤,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著崇决,像睡著了一般材诽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恒傻,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天脸侥,我揣著相機(jī)與錄音,去河邊找鬼盈厘。 笑死睁枕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沸手。 我是一名探鬼主播外遇,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼契吉!你這毒婦竟也來了跳仿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤捐晶,失蹤者是張志新(化名)和其女友劉穎塔嬉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體租悄,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡谨究,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泣棋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胶哲。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖潭辈,靈堂內(nèi)的尸體忽然破棺而出鸯屿,到底是詐尸還是另有隱情,我是刑警寧澤把敢,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布寄摆,位于F島的核電站,受9級特大地震影響修赞,放射性物質(zhì)發(fā)生泄漏婶恼。R本人自食惡果不足惜桑阶,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勾邦。 院中可真熱鬧蚣录,春花似錦、人聲如沸眷篇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蕉饼。三九已至虐杯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昧港,已是汗流浹背擎椰。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留慨飘,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓译荞,卻偏偏與公主長得像瓤的,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吞歼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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