finalize() 從 Java 9 開始 deprecated,Java 18 標記為 deprecated for removal,替代方案是 java.lang.ref.Cleaner。這篇從 PhantomReference 和 ReferenceQueue 的運作原理講起,說明 Cleaner 如何用獨立的清理執行緒安全地回收 native 資源,解決 finalize 的兩次 GC 回收、物件復活、執行時機不可控等問題,附完整程式碼範例、常見錯誤用法與 JDK 內部的實際應用案例。