JVM 시작 옵션

Protector4J는 패키징할 때 JVM 시작 옵션을 설정할 수 있고, 배포한 뒤에 임시로 추가하거나 생성된 실행 스크립트를 직접 편집할 수도 있습니다. GUI의 그 밖의 고급 옵션은 Protector4J 고급 모드 설정을 참고하세요.

1. 설정 방법 네 가지

방법적용 범위다시 패키징해도 남는지적합한 상황
GUI의 JVM 시작 옵션이번에 생성되는 모든 플랫폼의 실행 스크립트남습니다. 작업 설정이 있으면 다시 생성할 수 있습니다평소 대화형 패키징
명령줄의 --jvm-option이번에 생성되는 모든 플랫폼의 실행 스크립트남습니다. 명령이나 작업 파일이 설정의 출처가 됩니다CI/CD, 재현 가능한 빌드
run.sh, run.bat, Tomcat 스크립트 편집편집한 배포 디렉터리에만 적용남지 않습니다. 다시 패키징하면 덮어씌워집니다배포 후의 긴급 조치나 환경별 조정
APP_JAVA_OPTS 환경 변수현재 프로세스나 환경에만 적용파일에 아무것도 기록하지 않습니다임시 진단, 컨테이너·서비스 환경에서의 주입

오래 쓸 옵션은 GUI 작업이나 CLI 명령에 두고, APP_JAVA_OPTS는 임시 재정의에 쓰세요. 생성된 스크립트를 직접 고쳤다면 그 변경을 배포 문서에 적어 두세요. 다음에 패키징한 뒤 다시 적용해야 합니다.

2. GUI에서 설정하기

  1. 입력 페이지에서 고급 — 옵션을 직접 설정합니다를 선택합니다. 간단 모드로 들어왔다면 마지막 페이지의 사용자 정의 ... 로 고급 옵션을 열 수 있습니다.
  2. 일반 옵션 안의 JVM 시작 옵션을 찾습니다.
  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의 시작 경로에도 기록됩니다. 라이브러리 암호화는 아카이브만 만들고 실행 스크립트를 만들지 않으므로 이 입력란을 쓸 수 없습니다.

GUI의 JVM 시작 옵션

3. 명령줄에서 설정하기

옵션마다 --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'

패키저는 이 경계에 맞춰 셸 스크립트와 배치 파일 각각에 이스케이프를 적용합니다.

4. macOS와 Linux에서 스크립트 편집하기

일반 Java 애플리케이션과 Spring Boot 애플리케이션은 출력 디렉터리의 run.sh를 편집합니다. run.commandrun.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.shrun.bat 뒤에 둡니다.
  • 힙 크기를 바꾼 뒤에는 컨테이너 메모리 제한, 호스트의 가용 메모리, 실제 부하와 함께 확인하세요.
  • 다시 패키징하면 실행 스크립트가 덮어씌워지며, 직접 수정한 내용은 자동으로 병합되지 않습니다.