java代碼優(yōu)化——消除過期的對(duì)象引用

很多人可能在想這么一個(gè)問題:Java有垃圾回收機(jī)制嗤栓,那么還存在內(nèi)存泄露嗎?答案是肯定的精续,所謂的垃圾回收GC會(huì)自動(dòng)管理內(nèi)存的回收箕肃,而不需要程序員每次都手動(dòng)釋放內(nèi)存婚脱,但是如果存在大量的臨時(shí)對(duì)象在不需要使用時(shí)并沒有取消對(duì)它們的引用,就會(huì)吞噬掉大量的內(nèi)存勺像,很快就會(huì)造成內(nèi)存溢出障贸。

一、Java的垃圾回收機(jī)制

Java中的對(duì)象是在堆中分配吟宦,對(duì)象的創(chuàng)建有2中方式:new或者反射篮洁。對(duì)象的回收是通過垃圾收集器,JVM的垃圾收集器簡(jiǎn)化了程序員的工作督函,但是卻加重了JVM的工作嘀粱,這是Java程序運(yùn)行稍慢的原因之一激挪,因?yàn)镚C為了能正確釋放對(duì)象,必須監(jiān)控每一個(gè)對(duì)象的運(yùn)行狀態(tài)锋叨,包括對(duì)象的申請(qǐng)垄分、引用、被引用娃磺、賦值等薄湿,GC都要進(jìn)行監(jiān)控,監(jiān)控對(duì)象的狀態(tài)是為了更加準(zhǔn)確偷卧、及時(shí)地釋放對(duì)象豺瘤,而釋放對(duì)象的根本原則就是該對(duì)象不再被引用。

三听诸、Java中的內(nèi)存泄露

內(nèi)存泄露的對(duì)象有以下兩個(gè)特點(diǎn):

① 這些對(duì)象是可達(dá)的坐求,即在有向圖中存在通路可以與其相連。
② 這些對(duì)象是無用的晌梨,即程序以后都不會(huì)再使用這些對(duì)象桥嗤。

public class Stack {  
    private final static int MAX_ATTRIBUTE = 10;  
    private Object[] arr;  
    private int index = 0; 
    public void push(Object obj) {  
        if (index > 9)  
            throw new IllegalArgumentException();  
        arr[index] = obj;  
        index++;  
    }  
    public Stack() {  
        arr = new Object[MAX_ATTRIBUTE];  
    }  
    public Object pop() {  
        if (index < 0)  
            throw new IllegalArgumentException();  
        return arr[--index];  
    }  
}  

這個(gè)程序那里發(fā)生了內(nèi)存泄露呢?如果一個(gè)棧先增長(zhǎng)然后收縮仔蝌,那么從棧中彈出來的對(duì)象將不會(huì)被當(dāng)做垃圾回收泛领,即使使用棧的程序不再引用這些對(duì)象,它們也不會(huì)被回收敛惊,因?yàn)闂?nèi)部維護(hù)這對(duì)這些對(duì)象的過期引用渊鞋。

public Object pop() {    
    if (size == 0)    
        throw new EmptyStackException();    
    Object result = elements[--size];    
    elements[size] = null; //Eliminate obsolete reference       
    return result;    
}    

解決辦法:只要一個(gè)元素被彈出棧,那么就將它的引用置為空瞧挤,GC就會(huì)回收锡宋。即一旦數(shù)組元素變成了非活動(dòng)部分的一部分,就手工清空這些數(shù)組元素皿伺。

不要被類似的問題困擾

當(dāng)程序員第一次被類似這樣的問題困擾的時(shí)候员辩,他們往往會(huì)過分小心盒粮;對(duì)于每一個(gè)對(duì)象引用鸵鸥,一旦不再使用它,就把它清空丹皱,這是沒有必要的妒穴,這樣反而會(huì)把代碼弄的混亂。清空對(duì)象的引用應(yīng)該是一種例外(因?yàn)樗鼉H在一些特殊的情況下才需要進(jìn)行)摊崭,而不是一種規(guī)范行為讼油。消除過期引用最好的辦法是讓包含該引用的變量結(jié)束其生命周期。如果是在最緊湊的作用域范圍內(nèi)定義每一個(gè)變量呢簸,這種情況就會(huì)自然而然地發(fā)生矮台。
一般而言乏屯,只要類是自己管理內(nèi)存,就應(yīng)該警惕內(nèi)存泄漏問題瘦赫。一旦元素被釋放掉辰晕,則該元素中包含的任何對(duì)象引用都應(yīng)該被清空。

四确虱、常見的內(nèi)存泄露

① 緩存含友。一旦你把對(duì)象引用放到緩存中,它就很容易被遺忘掉校辩,從而使得它不再有用之后很長(zhǎng)一段時(shí)間內(nèi)仍然留在緩存中窘问。
② 在Java程序中,我們經(jīng)常要和監(jiān)聽器打交道宜咒,通常調(diào)用諸如addXXXListener()等方法來增加監(jiān)聽器惠赫,但往往忘記刪除這些監(jiān)聽器,從而增加了內(nèi)存泄漏的機(jī)會(huì)故黑。
③ 使用連接池時(shí)汉形,除了要顯式地關(guān)閉連接,還必須顯式地關(guān)閉Resultset和Statement對(duì)象倍阐。否則會(huì)造成大量的這些對(duì)象無法釋放概疆,從而引起內(nèi)存泄露。
④ 盡量少用靜態(tài)變量峰搪,因?yàn)殪o態(tài)變量存放在永久代岔冀,永久代基本不參與垃圾回收

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市概耻,隨后出現(xiàn)的幾起案子使套,更是在濱河造成了極大的恐慌,老刑警劉巖鞠柄,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侦高,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡厌杜,警方通過查閱死者的電腦和手機(jī)奉呛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夯尽,“玉大人瞧壮,你說我怎么就攤上這事〕孜眨” “怎么了咆槽?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)圈纺。 經(jīng)常有香客問我秦忿,道長(zhǎng)麦射,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任灯谣,我火速辦了婚禮法褥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘酬屉。我一直安慰自己半等,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布呐萨。 她就那樣靜靜地躺著杀饵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谬擦。 梳的紋絲不亂的頭發(fā)上切距,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音惨远,去河邊找鬼谜悟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛北秽,可吹牛的內(nèi)容都是我干的葡幸。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼贺氓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蔚叨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起辙培,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤蔑水,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后扬蕊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搀别,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年尾抑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了歇父。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛮穿,死狀恐怖庶骄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情践磅,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布灸异,位于F島的核電站府适,受9級(jí)特大地震影響羔飞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檐春,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一逻淌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疟暖,春花似錦卡儒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至欣舵,卻和暖如春擎鸠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缘圈。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工劣光, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糟把。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓绢涡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親遣疯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垂寥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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