본 프로젝트는 JVM 성능 튜닝 및 Docker 환경 최적화(CDS) 실험을 위한 코드입니다.
- Java: JDK 17
- Build Tool: Gradle
- Framework: Spring Boot 3.5.8
- Container: Docker
단순한 이론 학습을 넘어, 코드로 직접 검증하고 눈으로 확인하는 과정을 기록합니다.
- 알고리즘(N-Queens, Josephus)의 정확성 확인
- BaselineTest + JUnit을 통한 검증
- 실험 측정을 위한 프로파일링 도구 확인
- Intellij Profiler
- VisualVM
- Spring Boot 환경에서 구동 직후 테스트 작동을 위한 설정
- Intellij Profiler + ApplicationRunner + VisualVM 을 통한 성능 측정
🔗 링크를 통해 자세한 실험 정보를 확인할 수 있습니다.
- Baseline 데이터 : 13.6585 초
CompileThreshold를 통한 빠른 개입 시 : 13.2325 초 (약 0.4초 단축)Xss옵션을 통한 메모리 할당 최적화 : 13.4373 초 (약 0.2초 단축) / 스택 메모리 할당 2048Kb > 208Kb 로 최적화 판단MaxInlineSize옵션을 통한 Inlining 임계값 변화에 따른 성능 영향력 분석 : 13.4350 초 (약 0.2초 단축)
🔗 링크를 통해 자세한 실험 정보를 확인할 수 있습니다.
- Baseline 데이터 : 45.1624 초
- Goal: JVM의 Class Loading 비용이 기동 시간에 미치는 영향을 분석하고, CDS(Class Data Sharing) 를 통해 이를 얼마나 단축할 수 있는지 정량화합니다.
- Hypothesis: "애플리케이션 종료 시점에 클래스 메타데이터를 덤프(
ArchiveClassesAtExit)해두면, 재기동 시 파싱 비용이 제거되어 실행 속도가 획기적으로 단축될 것이다." - Plan:
- 대조군: 일반적인
java -jar실행 시의 기동 시간 측정 (Cold Start). - 실험군:
SharedArchiveFile옵션을 적용하여 미리 생성된 아카이브로 실행했을 때의 시간 측정. - 검증: 두 케이스 간의 기동 시간 단축률(%) 데이터를 확보하여 효율성 입증.
- 대조군: 일반적인
- Goal: Docker 컨테이너의 리소스 제한(Limit)과 JVM의 메모리 할당 정책(Ergonomics) 간의 괴리를 파악하고, 클라우드 환경에서의 운영 안정성을 확보합니다.
- Hypothesis: "최신 JVM은
-XX:+UseContainerSupport를 통해 Host OS가 아닌 컨테이너의 메모리 제한(Cgroup limit)을 기준으로 힙 크기를 자동 설정할 것이다." - Plan:
- 대조군: 컨테이너 지원 옵션 없이 실행하여 Host 전체 메모리를 힙 기준으로 인식하는 위험 상황 재현.
- 실험군: Docker 메모리 제한(예: 512MB) 환경에서 JVM이 계산한
MaxHeapSize확인. - 검증: 제한된 리소스 내에서 OOM 없이 안정적으로 힙이 할당되는지 확인.
- Goal: "Build-Time CDS Generation" 전략을 수립하여, 배포 직후 첫 실행(Cold Start)부터 최적화된 성능을 보장하는 컨테이너 이미지를 구축합니다.
- Hypothesis: "이미지 빌드 시점에 CDS 캐시를 내장해두면, 런타임에 별도의 워밍업 없이도 즉각적인 기동 속도 향상을 얻을 수 있을 것이다."
- Plan:
- 대조군: 일반적인 진입점(
entrypoint: java -jar app.jar)을 가진 Docker 이미지. - 실험군: 빌드 단계에서 생성된 CDS 덤프를 포함하고, 이를 로드하여 실행하는 Docker 이미지.
- 검증: 컨테이너 환경에서 CDS 적용 유무에 따른 기동 시간 차이를 측정하여, 프로덕션 도입 타당성 최종 증명.
- 대조군: 일반적인 진입점(