記錄讀書心得, 內容不一定和書上一致, 有些是我自己的看法。
即使 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
沒有留言:
張貼留言