JVM 核心知識總結
面試必考關鍵詞:JVM 垃圾回收、類加載機制。本文結合思維導圖系統梳理。

一、Java 四種引用
- 強引用:new Object(),GC 絕不回收,OOM 也不回收。
- 軟引用:內存夠不回收,不夠才回收,適合高速緩存。
- 弱引用:每次 GC 必回收,生命週期極短。
- 虛引用:不決定生命週期,配合 ReferenceQueue 追蹤回收。
二、運行時數據區劃分
- 程序計數器:線程私有,指向下一條指令。
- Java 虛擬機棧:線程私有,存棧幀(局部變量表、操作棧等),可能拋 StackOverflowError/OOM。
- 本地方法棧:服務 Native 方法,HotSpot 與 Java 棧合二為一。
- Java 堆:線程共享,GC 主戰場,分新生代(Eden + 2 Survivor)與老年代。
- 方法區:線程共享,存類信息、常量、靜態變量、JIT 代碼。HotSpot 稱永久代/元空間。
- 運行時常量池:方法區一部分,存字面量與符號引用。
GC 回收重點:堆與方法區(動態分配),棧等隨線程自動釋放。
三、對象存活判定算法
- 引用計數法:簡單高效,但無法解決循環引用,主流 JVM 未採用。
- 根搜索算法(GC Roots):從 GC Roots 向下搜索,不可達即可回收。GC Roots 包括:棧中引用、方法區靜態成員/常量、本地方法棧 JNI 引用。
四、垃圾回收算法
- 標記-清除:效率低、產生碎片。
- 複製算法:新生代適用,Eden:Survivor=8:1,無碎片、效率高,但浪費 10% 空間。
- 標記-整理:老年代適用,移動存活對象消除碎片,成本較高。
- 分代收集:新生代用複製,老年代用標記-清除/整理。
五、七大垃圾收集器
- Serial:單線程,Client 模式默認新生代收集器,STW。
- ParNew:Serial 多線程版,Server 模式首選新生代,唯一能與 CMS 配合。
- Parallel Scavenge:關注吞吐量,可自適應調節。
- G1:區域化、優先級回收,可指定停頓時間,JDK 7 成熟商用。
- CMS:並發標記清除,目標最短停頓,四階段(初始標記、並發標記、重新標記、並發清除),伴隨碎片問題。
六、類加載全過程
- 加載:獲取二進制流、轉換數據結構、生成 Class 對象。來源:本地 class、jar、網絡、動態編譯。
- 鏈接:驗證(格式/語義/字節碼)、準備(靜態字段賦默認值、分配方法區內存)、解析(符號引用轉直接引用)。
- 初始化:執行
<clinit>(靜態變量賦值、靜態塊)。觸發條件:new、訪問靜態字段/方法、反射、初始化子類、啟動主類。final static 常數編譯期入常量池,不觸發初始化。
附代碼驗證父子類初始化順序與 static final 行為差異。
七、對象實例化內存佈局
Student s = new Student():加載類 → 棧分配引用 → 堆分配對象 → 默認初始化 → 顯式初始化 → 構造器賦值 → 引用指向對象。
思維導圖源文件下載:2015-09-12-Java虛擬機詳解----JVM常見問題總結