Java 8 ? Java 17 升級:
構(gòu)建 → 啟動 → 依賴檢查 → 運行 → 性能 → 兼容性
升級前后對比目標
這份腳本包含:
- 同時在 Java 8 和 Java 17 下編譯 & 啟動。
- 檢查第三方依賴是否拋出 IncompatibleClassChangeError、NoClassDefFoundError。
- 基本的 JDK 特性檢查(反射、SPI、模塊訪問)。
- 簡單的壓力對比(吞吐、延遲、GC 日志)。
- 輸出比對結(jié)果做差異歸檔。
? 2?? 腳本結(jié)構(gòu)
以下示例以 Linux/macOS Shell 腳本為例(Windows 可用 PowerShell 同理):
?? 項目結(jié)構(gòu)示例
plaintext復制編輯project-root/
├─ scripts/
│ ├─ build_test.sh
│ ├─ run_java8.sh
│ ├─ run_java17.sh
│ ├─ compare_results.sh
├─ pom.xml
├─ src/...
? 3?? build_test.sh
用于切換不同 JDK 編譯、清理緩存、重新打包。
bash復制編輯#!/bin/bash
set -e
echo ">>> Cleaning build..."
mvn clean
echo ">>> Build with Java 8..."
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk
export PATH=$JAVA_HOME/bin:$PATH
java -version
mvn clean package -DskipTests
cp target/app.jar target/app-java8.jar
echo ">>> Build with Java 17..."
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$PATH
java -version
mvn clean package -DskipTests
cp target/app.jar target/app-java17.jar
echo ">>> Build finished. Artifacts:"
ls -lh target/app-*.jar
? 4?? run_java8.sh
用 Java 8 啟動。
bash復制編輯#!/bin/bash
set -e
echo ">>> Running with Java 8..."
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk
export PATH=$JAVA_HOME/bin:$PATH
java -version
nohup java \
-Xmx512m \
-jar target/app-java8.jar \
> logs/java8.log 2>&1 &
echo $! > java8.pid
echo ">>> Java 8 started with PID $(cat java8.pid)"
? 5?? run_java17.sh
用 Java 17 啟動。
bash復制編輯#!/bin/bash
set -e
echo ">>> Running with Java 17..."
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$PATH
java -version
nohup java \
-Xmx512m \
-XX:+UseG1GC \
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC \
-jar target/app-java17.jar \
> logs/java17.log 2>&1 &
echo $! > java17.pid
echo ">>> Java 17 started with PID $(cat java17.pid)"
? 6?? 簡單壓測對比
你可以用 ab
(Apache Bench) 或 wrk
進行對比:
bash復制編輯# Java 8
ab -n 10000 -c 50 http://localhost:8080/api/test > result_java8.txt
# Java 17
ab -n 10000 -c 50 http://localhost:8080/api/test > result_java17.txt
? 7?? compare_results.sh
自動化對比結(jié)果。
bash復制編輯#!/bin/bash
echo "=== Comparing Results ==="
echo ">>> Java 8 response time:"
grep "Time per request" result_java8.txt
echo ">>> Java 17 response time:"
grep "Time per request" result_java17.txt
echo ">>> GC Logs:"
echo "--- Java 8 ---"
grep GC logs/java8.log | tail -10
echo "--- Java 17 ---"
grep GC logs/java17.log | tail -10
echo "=== Diff Done ==="
? 8?? 啟動后可選驗證
例如:
bash復制編輯curl http://localhost:8080/actuator/health
curl http://localhost:8080/version
? 9?? 關(guān)閉腳本
bash復制編輯#!/bin/bash
kill $(cat java8.pid)
kill $(cat java17.pid)
? 10?? 結(jié)果對比點
檢查項 | Java 8 | Java 17 |
---|---|---|
JVM 啟動是否成功 | ? | ? |
是否有編譯警告 | ? | ?(若有模塊或反射警告) |
依賴兼容性 | ? | 需修復 |
平均延遲 | -- | -- |
吞吐 TPS | -- | -- |
GC 行為 | CMS | G1/ZGC |