首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 9 新特性全景解析:模塊化、JShell、HTTP/2、進程 API 與效能優化

     編輯:Java 相關知識

Java 9 里程碑版本深度解析:從 Jigsaw 模塊化到 HTTP/2 客戶端的 9 大核心特性

Java 9 於 2017 年 9 月發布,是 Java 8 後首個重大版本,引入模塊系統徹底重塑 JDK 結構,並帶來 REPL、HTTP/2、進程 API、多版本 JAR 等開發體驗與效能雙重提升的特性。本文系統梳理 9 大核心特性與遷移指南。

特性一:Jigsaw 項目 - 模塊系統 (JPMS) ⭐⭐⭐⭐⭐

核心目標:解決 JAR 地獄、封裝內部 API、縮減運行時體積、啟用編譯期模塊邊界檢查。

模塊描述符 module-info.java

module com.example.myapp {
    requires java.sql;           // 依賴模塊
    requires transitive java.logging; // 可傳遞依賴
    exports com.example.api;     // 導出包
    opens com.example.impl to com.example.test; // 反射開放
    uses com.example.spi.Service; // 使用服務
    provides com.example.spi.Service with com.example.impl.ServiceImpl; // 提供實現
}

關鍵變化

  • rt.jar 拆分:JDK 內部類庫模塊化,java.base 等 90+ 模塊
  • 強封裝:非導出包不可訪問,內部 API (sun.*, com.sun.*) 默認封鎖
  • jlink 定製運行時:jlink --module-path $JAVA_HOME/jmods --add-modules java.base,java.logging --output my-jre 生成 30MB+ 精簡 JRE
  • 多版本 JAR:同一 JAR 包含不同 JDK 版本類文件,META-INF/versions/9/

特性二:JShell - Java REPL (Read-Eval-Print Loop) ⭐⭐⭐⭐

$ jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro

jshell> String greeting = "Hello JShell"
greeting ==> "Hello JShell"

jshell> System.out.println(greeting)
Hello JShell

jshell> /list
   1 : String greeting = "Hello JShell"
   2 : System.out.println(greeting)

jshell> /save demo.jsh
jshell> /exit

優勢:即時驗證 API、學習語法、原型開發、教學演示,無需建項目、寫 main、編譯運行。

特性三:HTTP/2 客戶端 (標準化 incubator) ⭐⭐⭐⭐

// Java 9: jdk.incubator.httpclient
// Java 11+: java.net.http (標準化)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.github.com/users/octocat"))
    .header("Accept", "application/vnd.github.v3+json")
    .GET()
    .build();

HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode()); // 200
System.out.println(response.body());       // JSON 響應

// 異步非阻塞
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
      .thenApply(HttpResponse::body)
      .thenAccept(System.out::println)
      .join();

特性:HTTP/2 多路複用、Header 壓縮 (HPACK)、Server Push、WebSocket 原生支援、異步 CompletableFuture、響應式流 (BodyHandlers.ofPublisher())。

特性四:進程 API 增強 (ProcessHandle) ⭐⭐⭐

// 獲取當前進程 PID (跨平台)
long pid = ProcessHandle.current().pid();
System.out.println("PID: " + pid);

// 列舉所有進程
ProcessHandle.allProcesses()
    .filter(p -> p.info().command().orElse("").contains("java"))
    .forEach(p -> System.out.println(p.pid() + " " + p.info().command()));

// 獲取進程信息
ProcessHandle.Info info = ProcessHandle.current().info();
info.command().ifPresent(System.out::println);      // 命令
info.arguments().ifPresent(args -> System.out.println(Arrays.toString(args))); // 參數
info.startInstant().ifPresent(System.out::println); // 啟動時間
info.totalCpuDuration().ifPresent(System.out::println); // CPU 時間
info.user().ifPresent(System.out::println);         // 用戶

終結 Runtime.exec("ps -ef") 等平台相關 Hack,統一跨平台 API。

特性五:輕量級 JSON API (javax.json) ⭐⭐⭐

標準化 JSON 處理,無需三方庫 (Jackson/Gson) 即可完成基礎解析生成:

import javax.json.*;

JsonObject obj = Json.createObjectBuilder()
    .add("name", "Java 9")
    .add("features", Json.createArrayBuilder()
        .add("Modules").add("JShell").add("HTTP/2"))
    .build();

try (JsonWriter writer = Json.createWriter(System.out)) {
    writer.writeObject(obj); // 格式化輸出
}

// 解析
JsonReader reader = Json.createReader(new StringReader(jsonString));
JsonObject parsed = reader.readObject();
String name = parsed.getString("name");

特性六:貨幣與金融 API (JSR 354) ⭐⭐⭐

import javax.money.*;

MonetaryAmount amt1 = Money.of(1234.56, "USD");
MonetaryAmount amt2 = Money.of(789.01, "EUR");

// 貨幣轉換 (需匯率提供者)
ExchangeRateProvider provider = MonetaryConversions.getExchangeRateProvider("ECB");
CurrencyConversion conversion = provider.getCurrencyConversion("EUR");
MonetaryAmount converted = amt1.with(conversion); // USD -> EUR

// 格式化
MonetaryAmountFormat fmt = MonetaryFormats.getAmountFormat(Locale.GERMANY);
System.out.println(fmt.format(amt1)); // 1.234,56 USD

特性七:改進鎖爭用機制 ⭐⭐⭐

  • 優化 synchronized、ReentrantLock 在高爭用下的性能
  • Volano 基準測試顯示吞吐量顯著提升
  • 減少線程阻塞、上下文切換、CPU 緩存失效

特性八:代碼段緩存 (Code Cache Segmentation) ⭐⭐⭐

  • JIT 編譯代碼緩存分為三段:非方法代碼(永久)、短命 Profiling 代碼、長命 Non-Profiling 代碼
  • GC 掃描時跳過非方法代碼段,提升 GC 效率
  • 代碼淘汰策略更精細,減少內存碎片

特性九:智能編譯器 sjavac 第二階段 ⭐⭐

  • 並行編譯利用多核 CPU,大幅縮短 JDK 自身構建時間
  • 目標替代傳統 javac 成為默認編譯器
  • 增量編譯、依賴圖分析、並行任務調度

其他值得期待的特性 (後續版本交付)

特性狀態最終交付版本
HTTP/2 客戶端標準化Incubator → 標準Java 11 (JEP 321)
Var 類型推斷JEP 286Java 10
Switch 表達式JEP 325/354Java 12/13/14
Record 類型JEP 359/384/395Java 14/15/16
模式匹配JEP 305/375/394Java 14/16/17
密封類JEP 360/397/409Java 15/16/17

遷移指南:從 Java 8 升級關鍵點

  1. 模塊化兼容:--add-modules java.xml.bind,java.activation 解決 JAXB 等移除模塊
  2. 內部 API 封鎖:--add-opens java.base/java.lang=ALL-UNNAMED 臨時開放反射
  3. 類加載器變更:URLClassLoader 替換為內建加載器,自定義加載器需適配
  4. Javadoc HTML5:輸出格式變更,自定義 Doclet 需重寫
  5. 移除工具:jhat, jjs (Nashorn 後移除), appletviewer 等
  6. GC 默認變更:G1 成為默認 GC (Java 9+),調優參數需重新評估

版本發布節奏變革

Java 9 開啟六個月發布節奏 (3月/9月),LTS 版本每 3 年 (Java 8, 11, 17, 21...)。非 LTS 版本僅 6 個月支持,生產環境強烈建議鎖定 LTS。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved