2011年6月29日 星期三

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

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...