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

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

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

    讀《effective java》第二版,實用二,清除過期的對象引用

      內存泄漏幾種常見的方式:
      1. 無意識的對象保持。 就是接下來的例子。

      2. 使用緩存。(很長一段時間仍然留在緩存中)
           

        一旦你把對象引用放到緩存中,它就很容易被遺忘掉,從而使得它不再有用之后很長一段時間內仍然留在緩存中。對于這個問題,有幾種可能的解決方案。如果你正好要實現這樣的緩存:只要在緩存之外存在對某個項的鍵的引用,該項就有意義,那么就可以用WeakHashMap代表緩存;當緩存中的項過期之后,它們就會自動被刪除。記住只有當所要的緩存項的生命周期是由該鍵的外部引用而不是由值決定時,WeakHashMap才有用處。

    更為常見的情形則是,"緩存項的生命周期是否有意義"并不是很容易確定,隨著時間的推移,其中的項會變得越來越沒有價值。在這種情況下,緩存應該時不時地清除掉沒用的項。這項清除工作可以由一個后臺線程(可能是Timer或者ScheduledThreadPoolExecutor)來完成,或者也可以在給緩存添加新條目的時候順便進行清理。LinkedHashMap類利用它的removeEldestEntry方法可以很容易地實現后一種方案。對于更加復雜的緩存,必須直接使用java.lang.ref。


       3. 監聽器和其他回調

        如果你在實現的是客戶端注冊回調卻沒有顯式地取消注冊的API,除非你采取某些動作,否則它們就會積聚。確保回調立即被當作垃圾回收的最佳方法是只保存它們的弱引用(weak reference),例如,只將它們保存成WeakHashMap中的鍵。



    對于 1.無意識的對象保持,代碼:

     1 public class Stack {
     2     private Object[] elements;
     3     private int size = 0;
     4     private static final int DEFAULT_INITIAL_CAPACITY = 16;
     5 
     6     public Stack() {
     7         elements = new Object[DEFAULT_INITIAL_CAPACITY];
     8     }
     9 
    10     public void push(Object e) {
    11         ensureCapacity();
    12         elements[size++= e;
    13     }
    14 
    15     public Object pop() {
    16         if (size == 0)
    17             throw new EmptyStackException();
    18         return elements[--size];
    19     }
    20 
    21     /**
    22      * * Ensure space for at least one more element, roughly* doubling the
    23      * capacity each time the array needs to grow.
    24      */
    25     private void ensureCapacity() {
    26         if (elements.length == size)
    27             elements = Arrays.copyOf(elements, 2 * size + 1);
    28     }
    29 }
    修改方式:
        把上面的pop方法修改成如下:
       
        public Object pop() {
            
    if (size == 0)
                
    throw new EmptyStackException();
            Object result 
    = elements[--size];
            elements[size] 
    = null;
            
    return result;
        }

    清空過期引用的另一個好處是,如果它們以后又被錯誤地解除引用,程序就會立即拋出NullPointerException異常,而不是悄悄地錯誤運行下去。盡快地檢測出程序中的錯誤總是有益的。

    posted on 2009-12-17 20:52 胡鵬 閱讀(262) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

    <2009年12月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    統計

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    agile

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久这里只精品99re免费| 极品色天使在线婷婷天堂亚洲| 黄色视频在线免费观看| 无码欧精品亚洲日韩一区夜夜嗨 | 亚洲人精品午夜射精日韩| 美女被免费视频网站a| 国产免费小视频在线观看| 亚洲最大中文字幕无码网站| 亚洲AV无码久久精品蜜桃| a级日本高清免费看| 亚洲成色www久久网站夜月| 国产真人无码作爱免费视频| 亚洲日韩v无码中文字幕| 国产免费一区二区视频| 久久精品亚洲综合| 日本片免费观看一区二区| 亚洲国产成人精品无码区在线网站| 4399好看日本在线电影免费| 亚洲人成网站在线在线观看| 日本视频免费在线| 一级毛片成人免费看a| 亚洲爆乳无码一区二区三区| 中国人xxxxx69免费视频| 亚洲一本之道高清乱码| 99视频在线观看免费| 亚洲老妈激情一区二区三区| 91人成网站色www免费下载| 亚洲人成777在线播放| 日本免费一区二区三区最新vr| 免费一区二区无码视频在线播放| 亚洲色成人网站WWW永久| 99国产精品免费观看视频| 亚洲色中文字幕在线播放| 亚洲综合色视频在线观看| 无人在线观看免费高清| 亚洲一线产品二线产品| 中文字幕亚洲综合久久菠萝蜜 | 国产精品四虎在线观看免费| 中国毛片免费观看| 亚洲人成综合网站7777香蕉| 亚洲精品成人久久久|