<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    再談java的內(nèi)存泄露

    Posted on 2007-11-11 20:18 dennis 閱讀(2895) 評(píng)論(4)  編輯  收藏 所屬分類: java
        這兩天看了一本老書《bitter java》,第一次系統(tǒng)地了解了所謂“反模式”。就書的內(nèi)容來說已經(jīng)過于陳舊,書中提到的magic servlet、復(fù)合jsp等等反模式已經(jīng)是早就熟知的編程禁忌,而如web頁面不能有太多元素這樣的反模式也因?yàn)閍jax的出現(xiàn)(異步加載)變的不是那么“反模式”了,其中又講述了很多ejb的反模式,這些在輕量級(jí)框架流行的今天也早已經(jīng)過時(shí)。不過書中有一個(gè)章節(jié)倒是挺有價(jià)值,講述的是java的內(nèi)存泄露問題,我認(rèn)為是我目前讀的關(guān)于這方面問題比較有價(jià)值的介紹。
        網(wǎng)上關(guān)于java內(nèi)存泄露的資料都過于玄乎,其實(shí)java導(dǎo)致內(nèi)存泄露的原因很明確:長生命周期的對(duì)象持有短生命周期對(duì)象的引用就很可能發(fā)生內(nèi)存泄露,盡管短生命周期對(duì)象已經(jīng)不再需要,但是因?yàn)殚L生命周期對(duì)象持有它的引用而導(dǎo)致不能被回收,這就是java中內(nèi)存泄露的發(fā)生場景。作者在書中提到了3個(gè)場景:
    1。流失監(jiān)聽器問題,在awt、swing編程中,給組件添加了事件監(jiān)聽器,這些組件的生命周期如果很長的話,監(jiān)聽器對(duì)象將不能被正確回收。關(guān)于GUI編程我不是很熟悉,這一點(diǎn)存有疑問,因?yàn)轱@然你觸發(fā)一個(gè)按鈕的事件,當(dāng)然是一直期待同樣的行為發(fā)生,如果刪除了監(jiān)聽器或者使用弱引用讓JVM回收不符合業(yè)務(wù)邏輯和用戶體驗(yàn)。

    2。集合類,集合類僅僅有添加元素的方法,而沒有相應(yīng)的刪除機(jī)制,導(dǎo)致內(nèi)存被占用。這一點(diǎn)其實(shí)也不明確,這個(gè)集合類如果僅僅是局部變量,根本不會(huì)造成內(nèi)存泄露,在方法棧退出后就沒有引用了會(huì)被jvm正常回收。而如果這個(gè)集合類是全局性的變量(比如類中的靜態(tài)屬性,全局性的map等),那么沒有相應(yīng)的刪除機(jī)制,很可能導(dǎo)致集合所占用的內(nèi)存只增不減,因此提供這樣的刪除機(jī)制或者定期清除策略非常必要。

    3。單例模式。不正確使用單例模式是引起內(nèi)存泄露的一個(gè)常見問題,單例對(duì)象在被初始化后將在JVM的整個(gè)生命周期中存在(以靜態(tài)變量的方式),如果單例對(duì)象持有外部對(duì)象的引用,那么這個(gè)外部對(duì)象將不能被jvm正常回收,導(dǎo)致內(nèi)存泄露,考慮下面的例子:
    class A{
        public A(){
               B.getInstance().setA(this);
       }
       ....
    }
    //B類采用單例模式
    class B{
         private A a;
         private static B instance=new B();
         public B(){}
         public static B getInstance(){
             return instance;
        }
        public void setA(A a){
              this.a=a;
        }
       //getter...
    }

    顯然B采用singleton模式,他持有一個(gè)A對(duì)象的引用,而這個(gè)A類的對(duì)象將不能被回收。想象下如果A是個(gè)比較大的對(duì)象或者集合類型會(huì)發(fā)生什么情況。

        上面所講的這些也啟發(fā)我們?nèi)绾稳ゲ檎覂?nèi)存泄露問題,第一選擇當(dāng)然是利用工具,比如jprofiler,第二就是在代碼復(fù)審的時(shí)候關(guān)注長生命周期對(duì)象:全局性的集合、單例模式的使用、類的static變量等等。

    評(píng)論

    # re: 再談java的內(nèi)存泄露  回復(fù)  更多評(píng)論   

    2007-11-12 19:54 by sitinspring
    做個(gè)記號(hào)先.

    # re: 再談java的內(nèi)存泄露  回復(fù)  更多評(píng)論   

    2007-11-13 13:36 by 匿名
    請(qǐng)問此文是你原創(chuàng)嗎?我在http://www.java125.cn/article.asp?id=2103,看到完全一樣的文章。

    # re: 再談java的內(nèi)存泄露[未登錄]  回復(fù)  更多評(píng)論   

    2007-11-13 14:01 by dennis
    @匿名

    是我原創(chuàng),轉(zhuǎn)載不注明出處的我也沒轍

    # re: 再談java的內(nèi)存泄露  回復(fù)  更多評(píng)論   

    2014-07-25 10:54 by 我你他
    有時(shí)候不知道哪的問題,因?yàn)橄到y(tǒng)對(duì)外不公開,性能問題更是不知道哪的事情,沒有辦法用邏輯測試,因?yàn)樗请S機(jī)的,只能在代碼上盡量做好
    主站蜘蛛池模板: 黄网站在线播放视频免费观看| 亚洲综合色丁香麻豆| 黄色a级免费网站| 国产精品免费小视频| 亚洲av无码一区二区三区天堂| 国产大片免费网站不卡美女| 亚洲美女视频一区二区三区| 69影院毛片免费观看视频在线 | 亚洲AV永久无码精品成人| a级毛片高清免费视频| 亚洲AV无码久久精品成人 | 青春禁区视频在线观看直播免费| 亚洲另类古典武侠| 成人免费视频网址| 免费播放美女一级毛片| 亚洲人成色77777在线观看大| 中文字幕在线免费播放| 亚洲AV日韩AV天堂久久| 久久国产免费福利永久| 亚洲爆乳少妇无码激情| 国产a v无码专区亚洲av| 国产免费爽爽视频在线观看| 91亚洲国产成人久久精品网址| 日韩免费无码一区二区视频| 一级做a爰片久久免费| 亚洲AV本道一区二区三区四区| 久久午夜免费视频| 黄床大片30分钟免费看| 亚洲av成人无码久久精品| 成人免费看吃奶视频网站| 亚洲精品黄色视频在线观看免费资源 | 免费中文字幕在线| 精品四虎免费观看国产高清午夜| 久久精品亚洲精品国产色婷| 免费无码又爽又刺激高潮| 成人片黄网站色大片免费观看cn| 亚洲熟妇无码久久精品| 免费一级毛片在线播放| 95免费观看体验区视频| 激情吃奶吻胸免费视频xxxx| 亚洲美女aⅴ久久久91|