關鍵差異:參考 vs 物件
{
String s = new String("a string");
} // s 參考在此消失
// 但 String 物件仍佔據記憶體,只是無法存取
- 參考(句柄):有作用域,離開區塊即銷毀;
- 物件本體:在堆積區,生命週期不受作用域限制,只要還有參考指向它就存活。
C/C++ 的痛點
- C++ 物件可在堆疊/靜態區/堆積區,程式設計師需自行管理銷毀時機;
- 易發生:記憶體洩漏(忘記
delete)、懸空指標(釋放後仍用)、重複釋放。
Java 的解決方案:垃圾收集器
- GC 定期掃描堆積區,找出不可達物件(無參考指向);
- 自動回收其記憶體,供新物件使用;
- 程式設計師只需建立物件,無需(也無法)手動釋放。
GC 的優勢
- 消除記憶體洩漏(邏輯洩漏除外,如集合持有不再用的物件);
- 避免懸空指標錯誤;
- 簡化記憶體管理,降低認知負荷。
總結
Java 透過「參考有作用域、物件在堆積區、GC 自動回收」模型,徹底解決了 C/C++ 手動記憶體管理的痛點。這是 Java 提高開發效率、健壯性的核心基礎設施之一。