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

Java 虛擬機常用命令行參數速查表:運行、JAR、版本、記憶體配置

     編輯:Java 相關知識

java 命令核心語法

java [options]  [args...]           # 執行類
java [options] -jar  [args...]        # 執行可執行 JAR
java [options] -m / [args...] # 執行模組主類 (JDK 9+)
java [options] --source    # 單檔案源碼直接運行 (JDK 11+)

四大核心參數類別速查

1. 類運行與模組

參數說明示例
帶 `main` 方法的類全限定名 (含包名,**無 `.class` 後綴**)`java com.example.Main`
-cp / `-classpath類搜尋路徑 (目錄/JAR/ZIP),分隔符 `;` (Win) / `:` (Linux/Mac)`java -cp lib/*:target/classes com.example.Main`
-jar執行可執行 JAR (Manifest 需 `Main-Class`),**忽略 `-cp`**`java -jar app.jar`
-m / `--module模組化運行 (JDK 9+),指定模組/主類`java -m com.app/com.example.Main`
--add-modules額外解析模組 (如 `java.se.ee`、腳本引擎)`--add-modules=java.xml.bind`

2. 版本與診斷資訊

參數說明輸出示例
-version顯示 JDK 版本資訊並退出`openjdk version "21.0.2" 2024-01-16`
`OpenJDK Runtime Environment (build 21.0.2+13)`
`OpenJDK 64-Bit Server VM (build 21.0.2+13, mixed mode, sharing)`
-showversion顯示版本並繼續執行同上 + 程序輸出
-X列出所有非標準 `-X` 參數輸出幫助列表
-XX:+PrintFlagsFinal輸出所有 `-XX` 參數最終值 (含預設值)`uintx MaxHeapSize := 8388608000`
-XX:+PrintCommandLineFlags輸出啟動時生效的參數 (含人為指定與人體工學預設)`-XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296`

3. 記憶體與堆配置 (核心調優參數)

參數含義單位/預設建議
-Xms初始堆大小單位: k/m/g, 預設: 物理記憶體 1/64**設 = Xmx**,避免伸縮
-Xmx最大堆大小單位: k/m/g, 預設: 物理記憶體 1/4**設 = Xms**,留 25-30% 給 OS/元空間/線程/直接記憶體
-Xmn新生代大小 (含 Eden+Survivor)無預設,由 `NewRatio` 推導**顯式設定**,吞吐優先大新生代 (1/3-1/2 堆),低停頓小新生代
-XX:NewRatio=老年代/新生代比例預設 2 (老:新=2:1)配合 Xmn 二選一
-XX:SurvivorRatio=Eden/Survivor 比例預設 8 (Eden:Survivor=8:1)大對象多可調大 Survivor
-XX:MaxTenuringThreshold=晉升老年代年齡閾值預設 15 (Parallel), 6 (CMS)動態年齡判定通常更有效
-XX:PermSize / MaxPermSize永久代大小 (JDK 7-)預設 16M / 64M**固定設大**,防 PermGen OOM
-XX:MetaspaceSize / MaxMetaspaceSize元空間大小 (JDK 8+)預設無上限 / 無上限**設上限**防本地記憶體耗盡
-XX:MaxDirectMemorySize直接記憶體上限 (NIO)預設 = MaxHeapSizeNetty/RocketMQ 大量 DirectBuffer 必調大
-Xss線程棧大小預設 1M (64位 Linux)深度遞歸調大 (256k-512k),高併發線程多調小 (256k)

4. 垃圾收集器選擇 (JDK 8 基線,JDK 9+ 預設 G1)

收集器組合啟用參數適用場景
Serial-XX:+UseSerialGC單核、小堆、Client、嵌入式
Parallel Scavenge + Parallel Old-XX:+UseParallelGC (JDK 8 Server 預設)**吞吐量優先**、批次、科學計算、無低停頓要求
ParNew + CMS-XX:+UseParNewGC -XX:+UseConcMarkSweepGC**低停頓優先** (JDK 9 棄用, 14 移除)
G1-XX:+UseG1GC (JDK 9+ 預設)**大堆 (4G+)、可預測停頓、綜合最優**、現代首選
ZGC-XX:+UseZGC (JDK 11+)**超低停頓 (<10ms)、超大堆 (TB)、延遲敏感**
Shenandoah-XX:+UseShenandoahGC (JDK 12+)類 ZGC、紅帽主導、OpenJDK 內建

Tomcat / 應用伺服器記憶體配置最佳實踐

  • 不要修改 `catalina.sh/bat` 直接加 `JAVA_OPTS` (易被覆蓋、難版控)。
  • 建立 `setenv.sh` (Linux/Mac) 或 `setenv.bat` (Windows) 放在 `$CATALINA_BASE/bin/`:
    # setenv.sh
    export JAVA_OPTS="-server -Xms4g -Xmx4g -Xmn1g \
    -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m \
    -XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
    -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/logs/gc.log \
    -Duser.timezone=Asia/Taipei -Dfile.encoding=UTF-8"
  • Docker 環境:`JAVA_OPTS` 透過環境變數注入,配合 `-XX:InitialRAMPercentage=50 -XX:MaxRAMPercentage=50` (JDK 8u191+) 自動適配容器記憶體限制 (CGroups v1/v2)。

單檔案源碼直接運行 (JDK 11+ 實用功能)

# Hello.java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, " + (args.length > 0 ? args[0] : "World"));
    }
}

# 直接運行 (自動編譯記憶體中執行,不產生 .class)
java Hello.java
java Hello.java JavaConf

適用:腳本化任務、教學演示、CI/CD 輕量步驟、快速驗證 API。

總結

掌握 `java` 命令核心參數,是 Java 開發者**部署、診斷、調優**的基礎內功。建議:

  1. 背誦「固定堆 (-Xms=Xmx)、顯式新生代 (-Xmn)、元空間上限、GC 日誌、收集器選擇」五大黃金組合。
  2. 參數變更**必經壓測驗證** (JMeter/Gatling + GC 日誌分析)。
  3. 遷移至 JDK 17/21 LTS,擁抱 G1/ZGC、模組化、記憶體百分比自適配、統一日誌、單檔運行等現代特性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved