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

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

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

    莊周夢蝶

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

    再談java的內存泄露

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

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

    3。單例模式。不正確使用單例模式是引起內存泄露的一個常見問題,單例對象在被初始化后將在JVM的整個生命周期中存在(以靜態變量的方式),如果單例對象持有外部對象的引用,那么這個外部對象將不能被jvm正?;厥?,導致內存泄露,考慮下面的例子:
    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模式,他持有一個A對象的引用,而這個A類的對象將不能被回收。想象下如果A是個比較大的對象或者集合類型會發生什么情況。

        上面所講的這些也啟發我們如何去查找內存泄露問題,第一選擇當然是利用工具,比如jprofiler,第二就是在代碼復審的時候關注長生命周期對象:全局性的集合、單例模式的使用、類的static變量等等。

    評論

    # re: 再談java的內存泄露  回復  更多評論   

    2007-11-12 19:54 by sitinspring
    做個記號先.

    # re: 再談java的內存泄露  回復  更多評論   

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

    # re: 再談java的內存泄露[未登錄]  回復  更多評論   

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

    是我原創,轉載不注明出處的我也沒轍

    # re: 再談java的內存泄露  回復  更多評論   

    2014-07-25 10:54 by 我你他
    有時候不知道哪的問題,因為系統對外不公開,性能問題更是不知道哪的事情,沒有辦法用邏輯測試,因為它是隨機的,只能在代碼上盡量做好
    主站蜘蛛池模板: 全亚洲最新黄色特级网站 | 啊灬啊灬别停啊灬用力啊免费看| 亚洲天天做日日做天天欢毛片| 九一在线完整视频免费观看| 可以免费观看的一级毛片| 国产综合激情在线亚洲第一页| 午夜一区二区免费视频| 亚洲色大成网站WWW国产| 欧美日韩国产免费一区二区三区| 亚洲成人高清在线观看| 国产人在线成免费视频| 一本天堂ⅴ无码亚洲道久久| 18禁无遮挡无码网站免费| 亚洲一区二区三区国产精华液| 成年女人色毛片免费看| 亚洲精品中文字幕无码A片老| 色吊丝永久在线观看最新免费| 亚洲欧美国产精品专区久久| 国产成人免费片在线视频观看| 美女露100%胸无遮挡免费观看 | 精品亚洲一区二区三区在线观看 | 成在线人免费无码高潮喷水| 久久亚洲精品视频| 最近2019年免费中文字幕高清 | 亚洲一区二区三区国产精品无码 | 亚洲男人第一无码aⅴ网站| 一个人看的www在线免费视频 | 妞干网免费观看视频| 高潮毛片无遮挡高清免费视频| 亚洲成a人片在线观看日本麻豆| 福利免费在线观看| 亚洲国产精品一区二区久| 国产成人3p视频免费观看| 国内精品一级毛片免费看| 亚洲国语在线视频手机在线| 日韩在线免费电影| 日韩免费在线视频| 亚洲日产乱码一二三区别| 亚洲美女又黄又爽在线观看| 久久经典免费视频| ww在线观视频免费观看w|