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에서 설정하기
- 입력 페이지에서 고급 — 옵션을 직접 설정합니다를 선택합니다. 간단 모드로 들어왔다면 마지막 페이지의 사용자 정의 ... 로 고급 옵션을 열 수 있습니다.
- 일반 옵션 안의 JVM 시작 옵션을 찾습니다.
- 한 줄에 하나씩, 완전한 형태로 입력합니다. 예:
-Xms512m
-Xmx2g
-Dfile.encoding=UTF-8
-Dspring.profiles.active=prod
- 최종 요약에서 확인한 뒤 보호를 실행합니다.
이 옵션들은 생성되는 run.sh와 run.bat에 기록됩니다. macOS의 run.command는 같은 run.sh를 호출하므로 같은 옵션을 씁니다. Tomcat의 경우 bin/catalina.sh와 bin/catalina.bat의 시작 경로에도 기록됩니다. 라이브러리 암호화는 아카이브만 만들고 실행 스크립트를 만들지 않으므로 이 입력란을 쓸 수 없습니다.

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.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.bat과 bin\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뒤에 둡니다. - 힙 크기를 바꾼 뒤에는 컨테이너 메모리 제한, 호스트의 가용 메모리, 실제 부하와 함께 확인하세요.
- 다시 패키징하면 실행 스크립트가 덮어씌워지며, 직접 수정한 내용은 자동으로 병합되지 않습니다.