全面剖析 JVM 記憶體模型、垃圾回收機制、收集器實作、核心調優參數,以及堆與棧的本質差異。
運行時記憶體分為共享內存區(全線程共享)與線程內存區(線程私有)。
持久帶:HotSpot 實現方法區,存放類資訊、方法、常量池。可用 -XX:PermSize、-XX:MaxPermSize 設定(JDK 8 後改為 Metaspace)。
堆:物件實例主要儲存區,分代管理:

每個線程獨有:PC Register(指令計數器)、JVM 棧、本地方法棧。
JVM 棧以棧幀為單位,每個方法調用對應一個棧幀,包含:
long/double 佔兩槽。
HotSpot 使用基於棧指令集(跨平台、程式碼緊湊),Dalvik/ART 使用基於寄存器(指令少、執行快)。最終均轉為 CPU 組合語言執行。
自動偵測並釋放無用記憶體,提高利用率,開發者無需手動釋放。
專注於共享區:**堆**與**持久帶**(方法區)。線程區隨線程銷毀自動釋放。

不可達物件經歷兩次標記:mark1 進入 Finalizer 隊列執行 finalize(),若復活則移除標記;mark2 確認最終回收。finalize() 僅執行一次,物件只有一次復活機會。
| 演算法 | 原理 | 優點 | 缺點 | 適用區域 |
|---|---|---|---|---|
| 標記-清除 | 標記後直接釋放 | 基礎簡單 | 記憶體碎片多 | Old Space 基礎 |
| 標記-複製 | 將存活物件複製到另一塊記憶體 | 無碎片、分配快 | 可用記憶體減半 | Young Space (Eden + Survivor) |
| 標記-整理 | 清除後將存活物件壓縮到一端 | 無碎片、空間利用高 | 需移動物件、耗時 | Old Space |

System.gc()、動態策略變化。| 參數 | 說明 |
|---|---|
-Xmx / -Xms | 最大/初始堆大小 |
-XX:NewSize / -XX:MaxNewSize | 新生代大小 |
-XX:PermSize / -XX:MaxPermSize | 持久帶大小 (JDK 8-) |
-XX:NewRatio | 新生代:老年代 比例 (如 2 表示 1:2) |
-XX:SurvivorRatio | Eden:Survivor 比例 (預設 8:1) |
-Xss | 單線程棧大小 (JDK 5+ 預設 1M) |
-XX:+PrintGCDetails | 輸出詳細 GC 日誌 |
-client:啟動快,C1 輕量編譯器,適合桌面應用。-server:啟動慢,C2 激進優化編譯器,長期運行效能高,適合伺服端。jvm.cfg 強制指定模式。Java 參數傳遞只有「傳值」:基本型別傳值副本;引用型別傳引用地址副本。修改引用指向的物件內容可見,但無法改變呼叫端的引用本身。

