掌握 java 命令的各種用法,對於部署、調優、排查生產故障至關重要。
# 執行當前目錄下的類(無包)
java HelloWorld
# 執行帶包的類(需在包根目錄下執行)
java com.example.HelloWorld
# 指定 classpath 執行
java -cp .:lib/* com.example.HelloWorld # Linux/Mac
java -cp .;lib/* com.example.HelloWorld # Windows
# 執行可執行 JAR(Manifest 指定 Main-Class)
java -jar app.jar
# 執行 JAR 中的指定類
java -cp app.jar com.example.HelloWorld
| 參數 | 含義 | 示例 |
|---|---|---|
| -Xms | 堆初始大小 | -Xms512m |
| -Xmx | 堆最大大小 | -Xmx2g |
| -Xmn | 新生代大小 | -Xmn512m |
| -Xss | 線程棧大小 | -Xss256k |
| -XX:MetaspaceSize | 元空間初始大小 (JDK 8+) | -XX:MetaspaceSize=128m |
| -XX:MaxMetaspaceSize | 元空間最大大小 | -XX:MaxMetaspaceSize=512m |
最佳實踐:生產環境建議 -Xms -Xmx 設置相同值,避免堆動態擴縮容引起停頓。
# 選擇收集器
-XX:+UseG1GC # G1 (JDK 9+ 默認)
-XX:+UseZGC # ZGC (JDK 11+ 低延遲)
-XX:+UseParallelGC # 吞吐量優先
# GC 日誌 (JDK 9+ 統一日誌格式)
-Xlog:gc*:file=/var/log/gc.log:time,uptime,level,tags:filecount=5,filesize=100m
# 舊版 (JDK 8)
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/gc.log
-version / -showversion:查看版本信息。-Xint:僅解釋執行(關閉 JIT),極慢,用於調試。-Xcomp:首次使用即編譯。-Xmixed:混合模式(默認)。-Xcheck:jni:檢查 JNI 調用。-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dumps:OOM 時導出堆快照。-XX:+PrintCommandLineFlags:打印啟動時生效的所有 XX 參數值。
# 打印類加載
-XX:+TraceClassLoading
# 模塊路徑
--module-path libs --module myapp
# 添加模塊讀取邊界
--add-modules java.xml.bind
# 開放封裝 (反射訪問內部 API)
--add-opens java.base/java.lang=ALL-UNNAMED
在 catalina.sh / setenv.sh 中設置 JAVA_OPTS 或 CATALINA_OPTS:
CATALINA_OPTS="-Xms2g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Xlog:gc*:/logs/gc.log"
Error: Could not find or load main class:類名錯誤、包路徑錯誤、classpath 未包含編譯輸出目錄。NoClassDefFoundError:運行時缺少依賴 JAR,檢查 -cp 或 Manifest Class-Path。OutOfMemoryError: Java heap space:增大 -Xmx 或排查內存洩漏。OutOfMemoryError: Metaspace:增大 MaxMetaspaceSize 或排查類加載洩漏。