內存泄漏詳細分析

首先蔚携,什么是內存泄露键科?經(jīng)常聽人談起內存泄露剪廉,但要問什么是內存泄露塌计,沒幾個說得清楚赞厕。內存泄露是指無用對象(不再使用的對象)持續(xù)占有內存或無用對象的內存得不到及時釋放唉堪,從而造成的內存空間的浪費稱為內存泄露炸卑。內存泄露有時不嚴重且不易察覺亡蓉,這樣開發(fā)者就不知道存在內存泄露证芭,但有時也會很嚴重瞳浦,會提示你Out of memory(內存泄漏)。

2174327940.png

內存泄漏的原因

在Java程序中废士,我們通常使用new為對象分配內存叫潦,而這些內存空間都在堆(Heap)上。

     Object object1 = new Object();//obj1
     Object object2 = new Object();//obj2
     object2 = object1;
     //...此時官硝,obj2是可以被清理的

new 出來的對象(new Object())會存在堆內存中矗蕊,而object1這個是堆里對象的引用短蜕,存在于棧上,指向堆中的對象obj1傻咖;但是當堆中的對象沒有引用指向時朋魔,垃圾回收就可以將它的內存收走。

所以object2指向的堆對象是可以被回收(清理)的卿操。因為沒有object1和object2都沒有指向它警检。
內存泄漏就是說堆上的對象得不到及時的回收,導致內存泄漏害淤。

舉個栗子:

public class Simple {
    Object object;
    public void method1(){
        object = new Object();
        //...其他代碼
    }
}

這里的object實例扇雕,其實我們期望它只作用于method1()方法中,且其他地方不會再用到它窥摄,但是镶奉,當method1()方法執(zhí)行完成后,object對象所分配的內存不會馬上被認為是可以被釋放的對象崭放,只有在Simple類創(chuàng)建的對象被釋放后才會被釋放腮鞍。

這就是一種內存泄露。解決方法就是將object作為method1()方法中的局部變量,當然莹菱,如果一定要這么寫移国,可以改為這樣:

public class Simple {
    Object object;
    public void method1(){
        object = new Object();
        //...其他代碼
        object = null;
    }
}

這樣,之前“new Object()”分配的內存道伟,就可以被GC回收迹缀。

一些容易發(fā)生內存泄露的例子和解決方法

靜態(tài)類/變量引起內存泄露

像HashMap、Vector等的使用最容易出現(xiàn)內存泄露蜜徽,這些靜態(tài)變量的生命周期和應用程序一致祝懂,他們所引用的所有的對象Object也不能被釋放,因為他們也將一直被Vector等引用著拘鞋。

容器使用時的內存泄露

查看集合源碼砚蓬,ArrayList的remove方法

/**
     * Removes the element at the specified position in this list.
     * Shifts any subsequent elements to the left (subtracts one from their
     * indices).
     *
     * @param index the index of the element to be removed
     * @return the element that was removed from the list
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

各種有close()方法的對象

比如數(shù)據(jù)庫連接(dataSourse.getConnection()),網(wǎng)絡連接(socket)和io連接盆色,以及使用其他框架的時候灰蛙,除非其顯式的調用了其close()方法(或類似方法)將其連接關閉,否則是不會自動被GC回收的隔躲。其實原因依然是長生命周期對象持有短生命周期對象的引用摩梧。

單例模式導致的內存泄露

單例模式,很多時候我們可以把它的生命周期與整個程序的生命周期看做差不多的宣旱,所以是一個長生命周期的對象仅父。如果這個對象持有其他對象的引用,也很容易發(fā)生內存泄露。

內部類和外部模塊的引用
其實原理依然是一樣的笙纤,只是出現(xiàn)的方式不一樣而已耗溜。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市省容,隨后出現(xiàn)的幾起案子抖拴,更是在濱河造成了極大的恐慌,老刑警劉巖蓉冈,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件城舞,死亡現(xiàn)場離奇詭異,居然都是意外死亡寞酿,警方通過查閱死者的電腦和手機家夺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伐弹,“玉大人拉馋,你說我怎么就攤上這事〔液茫” “怎么了煌茴?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長日川。 經(jīng)常有香客問我蔓腐,道長,這世上最難降的妖魔是什么龄句? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任回论,我火速辦了婚禮,結果婚禮上分歇,老公的妹妹穿的比我還像新娘傀蓉。我一直安慰自己,他們只是感情好职抡,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布葬燎。 她就那樣靜靜地躺著,像睡著了一般缚甩。 火紅的嫁衣襯著肌膚如雪谱净。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天蹄胰,我揣著相機與錄音岳遥,去河邊找鬼。 笑死裕寨,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播宾袜,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼捻艳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庆猫?” 一聲冷哼從身側響起认轨,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎月培,沒想到半個月后嘁字,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡杉畜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年纪蜒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片此叠。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡纯续,死狀恐怖,靈堂內的尸體忽然破棺而出灭袁,到底是詐尸還是另有隱情猬错,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布茸歧,位于F島的核電站倦炒,受9級特大地震影響,放射性物質發(fā)生泄漏软瞎。R本人自食惡果不足惜逢唤,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铜涉。 院中可真熱鬧智玻,春花似錦、人聲如沸芙代。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纹烹。三九已至页滚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铺呵,已是汗流浹背裹驰。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留片挂,地道東北人幻林。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓贞盯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沪饺。 傳聞我的和親對象是個殘疾皇子躏敢,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容