傳統語言(C/C++)編譯直接產出機器碼,綁定特定 CPU 指令集與作業系統 ABI。Java 引入中間層——字節碼與 JVM:
.java --(javac)--> .class (字節碼) --(JVM 解釋/JIT 編譯)--> 機器碼執行
.class 不包含硬體資訊,僅定義虛擬指令集。JVM 負責在具體平台上將虛擬指令映射為真實機器指令,實現平台無關性。
| 版本 | 全稱 | 適用場景 | 核心差異 |
|---|---|---|---|
| Java SE | Standard Edition | 桌面、伺服器通用開發 | 完整核心 API、JVM、工具 |
| Java EE | Enterprise Edition | 企業級分散式系統 | 在 SE 基礎上增 Servlet、EJB、JMS、JPA 等伺服器端 API |
| Java ME | Micro Edition | 嵌入式、功能機、智慧卡 | 精簡 JVM (KVM/CVM)、子集 API、專用模擬器 |
| 區域 | 線程共享性 | 核心內容 | OOM 風險 |
|---|---|---|---|
| 方法區 / Metaspace | 共享 | 類元數據、常量池、靜態變數、JIT 編譯代碼 | 類過多、字符串常量池洩漏 |
| 堆 | 共享 | 所有物件實例、數組 | 物件無法回收、大物件分配 |
| 虛擬機棧 | 私有 | 棧幀(局部變數表、操作數棧、動態連接、返回地址) | 遞歸過深、大局部變數 |
| 本地方法棧 | 私有 | Native 方法調用狀態 | JNI 調用深度過大 |
| 程序計數器 | 私有 | 當前執行字節碼行號 | 極少見 |
iadd int、ladd long、fadd float…)| 年代 | 代表算法/收集器 | 核心思想 | 適用場景 |
|---|---|---|---|
| 早期 | 引用計數、複製、標記-清除、標記-整理 | 單一演算法、全堆掃描 | 小堆、嵌入式 |
| JDK 1.2~1.4 | Serial、Parallel Scavenge、CMS | 分代假設(新生代/老年代)、並行/並發 | 多核伺服器、低延遲需求 |
| JDK 7~10 | G1 (Garbage First) | 區域化、混合收集、可預測停頓 | 大堆 (4G+)、均衡吞吐/延遲 |
| JDK 11+ | ZGC、Shenandoah、Epsilon | 着色指標/連接矩陣、超低延遲 (<10ms)、無 GC | 超大堆 (TB 級)、實時系統、效能測試 |
-Xms -Xmx 固定值,避免動態擴縮容抖動-XX:+UseG1GC (預設 JDK 9+) / -XX:+UseZGC (JDK 11+ 大堆低延遲)jstat、jmap、jhat、VisualVM、JConsole、Arthas、GCeasyJVM 是 Java 生態的「作業系統」。理解字節碼→JIT→機器碼執行流程、運行時數據區劃分與分代 GC 演進,是從「會用 Java」進階到「駕馭 Java」的必經之路。下一步建議:動手分析一個真實專案的 GC 日誌,嘗試調優停頓至業務可接受範圍。