基於《深入理解 Java 虛擬機》JDK 1.6 規範(JDK 1.8+ 部分區域有變化,文中標註)。
| 區域 | 線程共享性 | 核心職責 | JDK 1.8+ 變化 |
|---|---|---|---|
| 堆 | ✅ 共享 | 對象實例分配區,GC 主戰場 | 無本質變化,默認開啟壓縮指針 |
| 方法區 | ✅ 共享 | 類元數據、常量、靜態變量、JIT 代碼 | 元空間 替換永久代,移至本地內存 |
| 虛擬機棧 | ❌ 私有 | Java 方法執行:棧幀(局部變量表、操作數棧、動態鏈接、返回地址) | -Xss 調整棧大小 |
| 本地方法棧 | ❌ 私有 | Native 方法執行服務 | 同上 |
| 程序計數器 | ❌ 私有 | 當前線程執行字節碼行號指示器 | 唯一無 OOM 區域 |
StackOverflowError(深度過大)、OutOfMemoryError(擴展失敗)native 方法(C/C++ 實現)StackOverflowError/OutOfMemoryError-Xms/-Xmx 控制-XX:PermSize/-XX:MaxPermSize-XX:MetaspaceSize/-XX:MaxMetaspaceSizeString.intern() 可動態擴充「一堆一區共天下,兩棧一計自家珍」
- 共享:堆、方法區
- 私有:虛擬機棧、本地方法棧、程序計數器
| 題目 | 陷阱點 | 正確答案 |
|---|---|---|
| 對象一定在堆上分配嗎? | 忽略逃逸分析 | 不一定。標量替換、棧上分配、鎖消除可使對象不進堆 |
| 方法區就是永久代嗎? | 混淆規範與實現 | 方法區是規範,永久代是 HotSpot 1.7 前實現,1.8 用元空間實現 |
| 局部變量線程安全嗎? | 忽略引用逃逸 | 基本類型安全;引用類型若未逃逸出方法則安全 |
| 常量池在哪? | 版本不清 | 1.6 PermGen;1.7 堆;1.8+ 堆(字符串常量池),類常量池在元空間 |
周志明. 深入理解 Java 虛擬機:JVM 高級特性與最佳實踐 (第 2/3 版). 機械工業出版社.