Java 2 Standard Edition 5.0(代號「Tiger」)帶來了虛擬機層面的重大改進,旨在解決開發者長期關注的啟動速度、記憶體佔用與故障診斷難題。本文將深入探討共享類數據、致命錯誤處理器、Solaris 線程優先級調整、服務器類別自動探測以及垃圾收集器預設變更等核心更新。
傳統 JVM 啟動時需從 rt.jar 載入所有系統類,耗時且佔用大量記憶體。Tiger 引入類數據共享(Class Data Sharing,CDS)機制,在安裝階段預先將系統類的內部表示序列化為記憶體映射文件 classes.jsa(Java Shared Archive)。啟動時直接映射此文件,帶來雙重收益:
文件位置隨平台而異:Windows 位於 jre\bin\client\classes.jsa,Linux 位於 jre/lib/[arch]/client/classes.jsa。若需重新生成,可執行 java -Xshare:dump;若不想使用,可指定 -Xshare:off。預設為 -Xshare:auto,文件存在即自動啟用。
新增的非標準選項 -XX:OnError 允許在 JVM 遭遇致命錯誤時自動執行指定命令,支援 %p 佔位符(替換為進程 ID)。典型用法:
-XX:OnError="gcore %p; dbx - %p"
-XX:OnError="gdb %p"
-XX:OnError="pmap %p"
此功能基於 Java Debug Interface (JDI) 服務性代理連接器,配合 JDK 附帶的診斷工具(jps、jstat、jinfo、jmap、jstack),可快速獲取核心轉儲、堆棧跟蹤、記憶體映射等關鍵信息,極大簡化了疑難雜症的排查流程。
為使 Java 線程與原生線程調度優先級一致,Tiger 在 Solaris 上調整了 Thread.setPriority() 的映射邏輯:
這意味著優先級 5 到 10 之間不再有細微差別。Linux 與 Windows 平台不受影響,開發者在 Solaris 上部署時需注意此行為變更。
Tiger 引入服務器類別探測:擁有 ≥2 CPU 且 ≥2 GB 物理記憶體的 32 位 Solaris SPARC 或 Linux/x86 機器,若未顯式指定 -client 或 -server,將自動選用 Server VM。Server VM 雖啟動較慢,但長時間運行效能更優。
當運行於 Server VM 或服務器級硬體上,預設垃圾收集器從串行 -XX:+UseSerialGC 切換為並行 -XX:+UseParallelGC,並同步調整堆大小與時間目標相關預設值,充分利用多核優勢。
Java 5.0 虛擬機透過類數據共享、錯誤診斷增強、線程調度優化及智能運行模式選擇,顯著提升了啟動速度、降低了記憶體壓力,並強化了生產環境下的可觀測性。這些改進共同構成了更成熟、更適合企業級部署的 Java 運行時基石。