JVM 啟動引數配置

Protector4J 支援在打包時配置 JVM 啟動引數,也支援在部署後臨時追加或直接修改生成的啟動指令碼。GUI 中其他高階引數見 Protector4J 高階模式設定

1. 三種配置方式

方式生效範圍是否隨重新打包保留推薦用途
GUI 的 JVM startup options寫入本次生成的全部平臺啟動指令碼是,任務引數仍在時可重複生成日常互動式打包
CLI 的 --jvm-option寫入本次生成的全部平臺啟動指令碼是,命令/任務指令碼可作為配置源CI/CD、可重複釋出
修改 run.shrun.bat 或 Tomcat 指令碼只修改當前部署目錄否,重新打包會覆蓋部署後的緊急或環境專屬調整
APP_JAVA_OPTS 環境變數隻影響當前程序或當前環境不寫入檔案臨時診斷、容器/服務環境注入

推薦把長期引數放在 GUI 任務或 CLI 命令中,把 APP_JAVA_OPTS 用作臨時覆蓋。直接修改生成指令碼後,應把改動記錄到部署配置;下次重新打包需要重新應用。

2. 在 GUI 中配置

  1. 在輸入頁選擇 Advanced — customise the options yourself;簡單模式可在最終頁點選 Customize… 進入高階引數。
  2. Common options 中找到 JVM startup options
  3. 每行輸入一個完整引數,例如:
-Xms512m
-Xmx2g
-Dfile.encoding=UTF-8
-Dspring.profiles.active=prod
  1. 在最終引數摘要中複核,然後執行保護。

這些引數會自動寫入生成的 run.shrun.bat;macOS 的 run.command 轉調 run.sh,因此使用相同引數。Tomcat 引數還會進入 bin/catalina.shbin/catalina.bat 的啟動路徑。Library Encryption 只生成歸檔、不生成啟動指令碼,因此不提供此配置。

GUI 中的 JVM startup options

3. 在 CLI 中配置

每個引數使用一次 --jvm-option,不要把多個 JVM 引數合併成一個值:

p4j javaapp app.jar dist \
  --jvm-option -Xms512m \
  --jvm-option -Xmx2g \
  --jvm-option -Dfile.encoding=UTF-8

Spring Boot:

p4j springboot app.jar dist \
  --jvm-option -Xms1g \
  --jvm-option -Xmx2g

Tomcat:

p4j tomcat app.war dist \
  --context /app \
  --jvm-option -Xms1g \
  --jvm-option -Xmx2g

帶空格或特殊字元的單個引數應整體引用:

--jvm-option '-Dexample.message=hello world'

編碼器會按引數邊界為 shell 和 batch 指令碼分別轉義。

4. macOS / Linux:直接修改指令碼

普通 Java 和 Spring Boot 應用編輯輸出目錄的 run.shrun.command 只是轉調 run.sh,無需重複修改。

找到 JVM_OPTS=(...) 以及後續可能存在的 JVM_OPTS+=(...),在 APP_JAVA_OPTS 判斷之前追加一行:

JVM_OPTS+=("-Xms512m" "-Xmx2g" "-Dfile.encoding=UTF-8")
if [ -n "${APP_JAVA_OPTS:-}" ]; then
  # ...
fi

不要刪除 Spring Boot/JavaFX 已生成的 --add-opens--module-path--add-modules 引數。

Tomcat 編輯 bin/catalina.sh,在 run_java() 中的 JVM_OPTS=(...) 後追加:

run_java() {
  JVM_OPTS=(...)
  JVM_OPTS+=("-Xms1g" "-Xmx2g")
  # ...
}

該修改同時影響 run.sh 前臺執行和 bin/startup.sh 後臺啟動。

5. Windows:直接修改指令碼

普通 Java 和 Spring Boot 應用編輯輸出目錄的 run.bat。找到生成的 set "JVM_OPTS=..." 行,在 APP_JAVA_OPTS 判斷之前追加:

set "JVM_OPTS=%JVM_OPTS% -Xms512m -Xmx2g -Dfile.encoding=UTF-8"
if defined APP_JAVA_OPTS set "JVM_OPTS=%JVM_OPTS% %APP_JAVA_OPTS%"

保留原有 JVM_OPTS 內容,不要刪除 Spring Boot/JavaFX 所需的內部引數。

Windows Tomcat 前臺執行

編輯 bin\catalina.bat,在原有 set "JVM_OPTS=..." 後追加:

set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g"

這會影響 run.batbin\catalina.bat run

Windows Tomcat 後臺啟動

bin\startup.bat 使用 PowerShell 建立後臺程序。最簡單的持久修改是在呼叫 catalina.bat 前設定 APP_JAVA_OPTS

@echo off
set "APP_JAVA_OPTS=-Xms1g -Xmx2g"
call "%~dp0catalina.bat" start %*
exit /b %ERRORLEVEL%

如需同時支援前臺和後臺且不維護兩處指令碼,優先通過 GUI 或 CLI 的 --jvm-option 重新生成 Tomcat 包。

6. 臨時使用 APP_JAVA_OPTS

macOS / Linux

APP_JAVA_OPTS="-Xms512m -Xmx2g" ./run.sh

Tomcat:

APP_JAVA_OPTS="-Xms1g -Xmx2g" ./bin/startup.sh

Windows CMD

在當前 CMD 會話中設定(後續命令仍會繼承,使用 set APP_JAVA_OPTS= 清除):

set "APP_JAVA_OPTS=-Xms512m -Xmx2g"
run.bat

只在區域性作用域中生效,執行後恢復原環境:

setlocal
set "APP_JAVA_OPTS=-Xms512m -Xmx2g"
call run.bat
endlocal

Tomcat:

set "APP_JAVA_OPTS=-Xms1g -Xmx2g"
bin\startup.bat

Windows PowerShell

$env:APP_JAVA_OPTS = '-Xms512m -Xmx2g'
.\run.bat
Remove-Item Env:APP_JAVA_OPTS

7. 引數順序與注意事項

  • 工具生成的執行時必需引數在前,GUI/CLI 配置的引數隨後寫入,APP_JAVA_OPTS 最後追加。
  • 部分 JVM 引數後出現的值會覆蓋前值,但並非所有引數都允許重複;應避免依賴重複引數覆蓋。
  • APP_JAVA_OPTS 按空格拆分,不適合包含空格的複雜單引數;此類引數優先使用 GUI、--jvm-option 或直接編輯指令碼陣列。
  • JVM 引數必須位於主類或 -jar 之前;應用引數放在 run.sh/run.bat 命令之後。
  • 修改堆大小後應結合容器記憶體限制、作業系統可用記憶體和實際負載進行驗證。
  • 重新打包會重寫啟動指令碼,手工改動不會自動合併。