前言:什麼是 Java?答案隨時代改變
十年前:Applet、位元組碼解譯、效能差、仰賴 Sun。
今天:雲原生、微服務、GraalVM 原生映像、OpenJDK 社群治理、Android/Kotlin/Scala 共舞 JVM。
一、Java 程式語言:在妥協中尋找平衡
核心特徵
- 面向物件、單繼承、介面多實作
- 靜態型別、強型別、檢查型異常
- 自動記憶體管理 (GC)
- 語法繼承 C/C++ (大括號)、語義受 Smalltalk 影響
爭議點與演進
| 議題 | 早期 | 現代 (Java 8~21) |
| 基本型別非物件 | 效能優先,破壞純 OO | 自動裝箱/拆箱、Value Types (Valhalla 專案進行中) |
| 檢查型異常 | 強制處理,API 簽名膨脹 | Try-with-resources、Functional Interface 不拋檢查異常、Vavr/Either 模式 |
| 註解 | 無 | JSR 175 → 編譯期/執行期處理、Lombok、MapStruct、Spring 生態基石 |
| 模組系統 | 無 | JPMS (Java 9)、強封裝、模組化 JDK、遷移挑戰大 |
生產力 vs 效能的動態平衡
CPU 週期成本遞減,開發者週期成本上升 → 抽象層不斷上移:
Bytecode → JIT → AOT (GraalVM) → Value Types → Pattern Matching → Virtual Threads (Loom)。
每一次妥協性能換取生產力,最終由硬體紅利填補。
二、Java 平台三大版本
| 版本 | 定位 | 關鍵差異 |
| Java SE | 標準桌面/伺服器 | 完整核心 API、JVM、工具鏈 |
| Java EE / Jakarta EE | 企業級分散式應用 | SE 超集,Servlet、JPA、CDI、JTA、JSON-P/B 等 |
| Java ME | 嵌入式/資源受限裝置 | 子集 + 專有 API (MIDP/CLDC)、Android 另闢蹊徑 |
現代雲原生多基於 SE + 獨立庫 (Spring Boot、MicroProfile) 而非完整 EE 伺服器。
三、JVM:不只是 Java 的執行引擎
執行模式演進
- 解譯器:逐條指令轉譯
- JIT (C1/C2/G1/ZGC/Shenandoah):熱點偵測 → 編譯優化 → 去優化
- AOT (GraalVM Native Image):編譯期生成原生機器碼,啟動極快、記憶體低、適合 Serverless/Function
多語言虛擬機生態
| 語言 | 特色 | 典型場景 |
| Kotlin | 現代語法、Null 安全、協程、100% 互通 | Android、Spring Boot、多平台 |
| Scala | 函數式+OO、強型別、Akka、Spark | 巨量資料、高併發領域模型 |
| Groovy | 動態、DSL、Gradle、Spock 測試 | 建構腳本、測試、規則引擎 |
| Clojure | Lisp、不可變資料、STM、JVM 互操作 | 資料處理、並發系統 |
| JRuby/Jython | Ruby/Python 遷移 JVM | 舊系統整合、腳本化 |
JSR 292 (invokedynamic) 為動態語言提供高效呼叫支援,Lambda/Method Handle 同受惠。
四、Java 社群治理:JCP 與 OpenJDK 雙軌制
JCP (Java Community Process)
- 制定標準規格 (JSR):語言、API、JVM 行為
- 專家組審議、RI (參考實作) + TCK (相容性測試)
- 批評:Sun/Oracle 主導、專利授權條款、進度緩慢
OpenJDK
- JDK 參考實作開源 (GPLv2 + CE)
- 主要貢獻者:Oracle、Red Hat、IBM、Amazon、Microsoft、社群
- 六個月發布節奏 (LTS 每三年)、多廠商建構版本 (Temurin、Corretto、Zulu、Liberica、Dragonwell…)
關鍵里程碑
- 2006:Sun 開源 HotSpot/JDK
- 2010:Oracle 收購 Sun
- 2017:Java EE 移交 Eclipse 基金會 → Jakarta EE
- 2018:JCP 改革、Oracle JDK 商業授權變更
- 2023+:OpenJDK 成為事實標準、虛擬線程 (Loom) 交付、GraalVM 納入 OpenJDK
五、沒有 JVM 的 Java / 沒有 Java 的 JVM
- GCJ / Excelsior JET / GraalVM Native Image:Java 源碼 → 原生二進制,無需 JVM 部署,適合 CLI 工具、Serverless、邊緣運算。
- Axiomatic C → Bytecode / ASM / BCEL:非 Java 語言直接生成位元組碼,繞過 javac。
- JSR 292 / Truffle/Graal:多語言實作框架,JS (Nashorn→GraalJS)、Python (GraalPython)、R (FastR)、WASM 等高效運行於 JVM。
六、展望:下一個十年
- Virtual Threads (Project Loom):百萬級併發、同步寫法異步效能、重塑伺服器架構。
- Value Types / Primitive Classes (Valhalla):扁平化記憶體佈局、消除物件頭、基本型別即類別。
- Pattern Matching / Data-Oriented Programming:Record、Sealed Class、Switch 表達式、解構賦值。
- GraalVM Native Image 普及:即時編譯 + AOT 混合、多語言互操作、Serverless 首選。
- 模組化演進:強封裝工具化、模組感知建構、減少類路徑地獄。
結語
「什麼是 Java?」不再有單一答案。它是一個語言家族、一個執行平台、一個開放標準、一個多語言生態系統。未來屬於能駕馭這個生態、在抽象層級間自由切換的開發者。