자바 애플리케이션을 운영하면서 JVM의 다양한 옵션을 접하게 됩니다. 그 중 성능 튜닝에 유용한 옵션으로 -XX:+AlwaysPreTouch
가 있습니다.
이번 글에서는 JVM 메모리 구조와 운영 체제의 메모리 관리 기초를 살펴본 뒤, -XX:+AlwaysPreTouch
옵션이 무엇을 하는지, 활성화/비활성화 시의 차이는 무엇인지, 어떤 상황에서 유용한지와 성능 영향, 그리고 간단한 실험 결과까지 알아보겠습니다.
JVM은 실행 시 여러 메모리 영역을 사용합니다. 그 중 힙(heap)은 보통 가장 큰 영역으로, 애플리케이션이 동적으로 할당한 객체들이 저장되는 공간입니다.
-Xmx
옵션으로 설정한 최대 힙 크기까지 객체를 저장할 수 있고, -Xms
옵션으로 초기 힙 크기를 지정할 수 있습니다. 일반적으로 서버 환경에서는 힙의 초기 크기(Xms
)와 최대 크기(Xmx
)를 동일하게 설정해 JVM 실행 초기에 힙을 한 번에 할당해두기도 합니다.
<aside> 💡
Production environments often set the -Xms
and -Xmx
options to the same value so that the heap size is fixed and pre-allocated to the JVM. (출처)
</aside>
힙은 가비지 컬렉션에 의해 관리되며, 자바 8 이후로 Young Gen과 Old Gen 등으로 나뉘어 관리됩니다.
메타스페이스는 클래스 메타데이터를 저장하는 영역으로, 힙과 별도로 네이티브 메모리에 할당됩니다.