垃圾回收(GC)是 Java 程式設計師大幫手,但不能因 GC 存在就忽略記憶體問題,否則將導致嚴重後果。
System.gc() 僅是建議:通常觸發完整回收,比 JVM 自動觸發更徹底,但不保證回收所有可回收物件阻止 GC 回收。自行管理集合時易發生。以 ObjStack 為例:
public Object pop() {
index--;
return stack[index]; // 僅移動索引,陣列仍持有物件參考!
}
push 8 個物件後 pop 3 次,索引變 5,但陣列位置 5-7 仍持有參考,物件無法被 GC 回收,只有後續 push 覆蓋才可能釋放。
public Object pop() {
index--;
Object o = stack[index];
stack[index] = null; // 釋放參考,讓 GC 能回收
return o;
}
不再需要的物件,務必釋放參考。可用記憶體越少,GC 執行頻率越高,嚴重損害效能。