Effective Java 讀書筆記: Item 6 - 小心 memory leak

記錄讀書心得, 內容不一定和書上一致, 有些是我自己的看法。

即使 Java 有 gc, 仍然有可能寫出「memory leak」。描述不如看 code:

public class Stack {
    private Object[] elements;
    // ...
    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        return elements[--size];
    }
   // ...
}

elements 會一直留著 push 進來的 objects, 形成 memory leak。解法就是在 pop 裡面將 elements[size] 設為 null:

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

作者強調, 別矯枉過正四處狂設 null, 反而會讓程式很難讀。大部份情況讓物件離開 scope 自然地被回收即可。

幾個要點:

  • 若 class 自己有管記憶體 (比方說 object pool), 開發者就該留意 memory leak, 記得設 null
  • cache 常造成 memory leak。特殊情況下可用 WeakHashMap 自動解套。我還在參透 WeakHashMap 的效果和對應的情境, 以及為何它能做到這樣的效果。
  • listener 和 callback 也常造成 memory leak
  • 可用 heap profiler 找 memory leak

留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

熟悉系統工具好處多多

virtualbox 使用 USB 裝置