JVM warm up이란?
Java 코드는 .class 파일(bytecode)로 컴파일되고, JVM이 이 bytecode를 로딩해서 실행합니다. 이때 Lazy Loading이라는 개념이 등장합니다. class가 처음 호출되기 전까지 로딩을 미루는 방식입니다.
Lazy Loading 때문에 Java pod가 부팅된 직후에는 아직 로딩되지 않은 class가 많습니다. 그래서 부팅 시점에 미리 class를 로딩해 둘지 결정하는 옵션이 있고, 이 과정을 JVM warm up이라고 합니다.
warm up이 서비스 성능에 어떻게 영향을 미치는가?
애플리케이션 덩치가 커질수록 warm up 적용 여부가, 부팅이 막 된 서비스의 성능에 큰 영향을 끼칩니다. 아래 사례에서는 배포 직후 DB 커넥션 풀 에러를 JVM warm up으로 해결한 사례를 다룹니다.
class Lazy Loading 실습
class Lazy Loading을 직접 확인하려면 class가 로딩될 때마다 로그를 출력하게 설정하면 됩니다.
environment:
JAVA_OPTS: "-Xlog:class+load=info"
로그는 로딩된 시간과 어떤 class가 로딩되었는지 보여줍니다. 로그의 가장 왼쪽 타임스탬프가 로딩된 시간입니다.
[0.123s][info][class,load] com.example.classloading.service.ProductQueryService source: file:/app/app.jar
[0.456s][info][class,load] org.springframework.data.jpa.repository.JpaRepository source: file:/app/app.jar
Spring Boot는 애플리케이션이 실행될 때 component scan을 통해 service, controller 등 bean으로 등록되는 class를 미리 로딩합니다. 그래서 Spring Boot를 실행하면 class 로딩 로그에서 Spring Boot 컴포넌트를 확인할 수 있습니다.

제가 만든 예제로 테스트해 보면 특정 API를 호출한 전후로 로딩된 클래스 개수가 증가하는 것을 확인할 수 있습니다.
API 호출 전에는 로딩된 클래스가 14,410개였는데, API를 호출한 뒤에는 14,772개로 증가했습니다. 그 이후로는 같은 API를 반복 호출해도 14,772개에서 변화가 없습니다.

JVM warm up 실습
warm up 효과를 코드로 직접 보여주기는 어려웠지만, JVM warm up이 배포 직후 애플리케이션 성능에 실제로 영향을 준다는 것은 체감할 수 있게 했습니다.
- 예제 코드: https://github.com/choisungwook/portfolio/tree/master/computer_science/jvm_warmup
같은 API를 대상으로 warm up 적용 전후의 latency를 비교했습니다. k6로 부하를 발생시키고 k6 보고서에서 latency를 확인했습니다.
p90, p99 기준으로 warm up을 수행한 애플리케이션이 부팅 직후 warm up을 하지 않은 경우보다 latency가 16% 빨랐습니다. 시간이 지나면 두 경우의 latency는 비슷해졌습니다.


참고자료
'전공영역 공부 기록' 카테고리의 다른 글
| claude code로 wordpress 테마를 변경하고 페이지 렌더링 속도를 98% 단축한 후기 (0) | 2026.04.10 |
|---|---|
| 소켓 누수는 어떻게 시스템 전체를 불안정하게 만드는가? (0) | 2026.04.05 |
| Access Key 없이 IAM user가 AWS CLI 쓰는 방법(aws login) (0) | 2026.03.29 |
| custom EKS AMI 만들기 - Managed Node Group과 Karpenter 설정 차이 (0) | 2026.03.29 |
| Cache-Control, 브라우저부터 CDN까지 (0) | 2026.03.22 |