如同 8 缸引擎不一定比 4 缸更適合城市通勤,64 位元 JVM 並不總是比 32 位元快。早期將 JVM 移植到 64 位元(DEC Alpha、PowerPC)時,採用「指針雙倍化」最直接方案:所有物件參考從 32 位擴展為 64 位。結果導致:
| 子系統 | 32 位元優勢 | 64 位元挑戰 |
|---|---|---|
| JIT 編譯器 | 緊湊指針生成高密度機器碼 | 指針變長,寄存器壓力增大,指令碼膨脹 |
| 垃圾收集器 | 掃描物件圖快、記憶體佔用小 | 更大指針 → 更多記憶體頻寬、更長掃描暫停 |
洞察:64 位元位址空間(16 EB)遠超實際物理記憶體(通常 ≤ TB 級)。無需完整 64 位指針即可定位所有物件。
shift + add 指令還原真實地址,現代 CPU 單週期完成。| JVM | 啟用參數 | 最大支援堆 | 備註 |
|---|---|---|---|
| IBM JDK 6+ | -Xcompressedrefs | 32 GB | 成熟穩定,企業級首選 |
| Oracle/BEA JRockit | -XXcompressedRefs | 32 GB | 類似實現 |
| HotSpot (Sun/Oracle/OpenJDK) | -XX:+UseCompressedOops | 32 GB (JDK 7+) | JDK 6u23+ 預設開啟(<4GB堆) |
java -XX:+PrintFlagsFinal -version | grep CompressedOops 或觀察物件頭大小(開啟後 Ordinary Object Pointer 為 4 位元組)。Java 最初設計為 32 位元系統(1995),早期移植採用「暴力擴展」。直到 JDK 6 才引入成熟的壓縮指針技術,徹底解決了「64 位元稅」。現代 JDK(8/11/17/21)在預設堆閾值下自動開啟,開發者多無感知即享受紅利。
「64 位元不等於 2 倍性能,也不等於 2 倍記憶體。理解壓縮指針,才能做出正確的架構選型。」