String、LocalDate、Guava 不可變集合)。obj = null 多此一舉。String[1024] arr; arr[100] = null;)需手動釋放,否則整個陣列保持可達。最佳做法:直接用 ArrayList 等標準集合。-XX:+DisableExplicitGC 參數禁止。System.gc()。-Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000(單位微秒,調大間隔);-XX:+ExplicitGCInvokesConcurrent 讓顯式 GC 走 CMS 並發路徑。try-with-resources 或 finally 區塊顯式關閉。finalize()。洩漏定義: 物件對應用已無用,但因被長生命週期物件持有而持續可達,無法被 GC 回收。
| 常見原因 | 對策 |
|---|---|
| 長壽命集合(Map/List/快取)未清理 | 用 WeakHashMap、定期清理、或 WeakReference 包裝值 |
| 變數作用域定義錯誤(局部變成欄位/靜態) | 嚴格限制變數作用域,盡量用局部變數 |
| 異常路徑未在 finally 釋放資源(JDBC 連線、流) | 全面採用 try-with-resources |
| Swing 監聽器未移除、內部類隱含外部參考、Finalizer 延遲釋放關聯物件 | 明確移除監聽器、靜態內部類+弱參考、避免 finalize |
jps 找進程 ID。jmap -histo pid 查看類別實例數與佔用大小;jmap -dump:file=heap.bin pid 導出堆快照。jhat heap.bin 啟動分析伺服器,瀏覽器開 https://localhost:7000/ 追蹤 GC Roots 保留路徑。