java [options] [args...] # 執行類
java [options] -jar [args...] # 執行可執行 JAR
java [options] -m / [args...] # 執行模組主類 (JDK 9+)
java [options] --source # 單檔案源碼直接運行 (JDK 11+)
| 參數 | 說明 | 示例 |
|---|---|---|
| 帶 `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` |
| 參數 | 說明 | 輸出示例 |
|---|---|---|
-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` |
| 參數 | 含義 | 單位/預設 | 建議 |
|---|---|---|---|
-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) | 預設 = MaxHeapSize | Netty/RocketMQ 大量 DirectBuffer 必調大 |
-Xss | 線程棧大小 | 預設 1M (64位 Linux) | 深度遞歸調大 (256k-512k),高併發線程多調小 (256k) |
| 收集器組合 | 啟用參數 | 適用場景 |
|---|---|---|
| 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 內建 |
# 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"
# 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 開發者**部署、診斷、調優**的基礎內功。建議: