補充說明:關於物件引用與記憶體管理
承接前文,這裡補充幾個關鍵技術細節,幫助深入理解 Erlang 運行時機制。
引用語義與物件生命週期
在方法外部用 new 建立物件並回傳引用時,若該引用被某個變數持有,引用計數不為零,物件持續存在,不會被垃圾回收。這與 JVM 的可達性分析不同,Erlang 採用每進程獨立堆疊 + 共享二進位資料的混合模型:
- 小型資料(整數、元組、列表)在進程私有堆複製傳遞
- 大型二進位(> 64 位元組)分配於全域共享堆,透過引用計數管理
- 進程結束時私有堆整體回收,共享二進位需等所有引用釋放
參數傳遞:值傳遞的本質
Erlang 函數參數傳遞語義為「值傳遞」,但得益於不可變資料結構,編譯器與運行時會大量優化:
- 不可變資料結構天然支援結構共享(如列表尾部共享)
- 大型二進位傳遞僅複製引用描述符,不複製實際資料
- 編譯器對尾呼叫優化,避免堆疊增長
總結關鍵字
- new:建立新資料項
- 引用、物件:資料項與其標識
- 被垃圾回收的條件:無任何變數引用、進程結束、共享二進位引用計數歸零
- 參數:值傳遞:語義上傳值,實作上優化共享
理解這些機制,有助於設計高效能、低延遲的 Erlang 系統,避免不必要的資料複製與記憶體壓力。