Jave & Kotlin

자바 -Xms -Xmx 힙 메모리 설정

devLog by Ronnie's 2023. 3. 14. 23:04

Jar 파일을 실행할 때 여러 옵션들을 줄수가 있는데 그 중에서도 힙메모리 관련 설정인 -Xms와 -Xmx 옵션에 대해서 정리한다.

 

자바 -Xms -Xmx 힙 메모리 설정

 

자바 -Xms -Xmx 힙 메모리 설정

 

-Xms와 -Xmx


-Xms와 -Xmx 옵션은 Jar 파일을 실행할 때 초기 할당 메모리와 최대 할당 메모리를 지정하는 옵션이다. 간혹 -Xms 옵션을 초기 할당 메모리가 아닌 최소 할당 메모리로 잘못 알고 있는 경우가 있는데 최소가 아닌 초기 할당 이다.

 

만약 다음과 같이 설정을 했다고 가정해보자.

 

-Xms2048m -Xmx4096m

 

다음과 같이 옵션을 주고 jar 파일을 실행하게 되면 초기 힙 메모리 사이즈가 2048MB로 설정되고 최대는 4096MB로 설정이 된다.

 

테스트를 위해서 인텔리제이에서 자바 애플리케이션을 실행할 때 옵션 설정을 추가하여 실행해보자.

 

먼저 인텔리제이를 켜서 오른쪽 상단 위에 Application ->  Edit Configurations 를 눌러준다.

 

Run/Debug Configurations 창에서 Modify options를 눌러준다.

 

 

Add VM options 를 눌러준다.

이후에 나오는 VM options 항목에 설정을 다음과 같이 넣어주면 된다.

 

이렇게 설정했다면 설정대로 잘 실행되었는지 확인을 해보자

 

확인 방법은 다양하겠지만 가장 기본이 되는 터미널에서 명령어를 통해 확인이 가능하다.

ps -ef | grep java 로 검색해보면 다음과 같이 2048, 4096 설정이 잘되어 있는 것을 확인 할 수 있다.

 

VisualVM이 연동되어 있다면 해당 애플리케이션 내 Overview 탭에서도 확인 할 수있다.

 

VisualVM 툴을 이용하면 힙메모리 사이즈를 다음과 같이 실시간 그래프로 Monitor 탭에서 확인이 가능하다.

 

먼저 화면을 보면 Heap size가 2기가인 것을 확인 할 수 있다. (-Xms 값)

 

그렇다면 -Xmx 옵션 준대로 힙 메모리 사용량이 늘어나면 4기가까지 늘어나는 것을 확인해보자. (-Xmx는 jar 파일이 가질 수 있는 최대 동적 메모리이기 때문에 상황에 맞게 변한다.)

 

 

k6나 JMeter와 같은 api 부하테스트 툴을 이용하면 쉽게 힙메모리 사용량을 증가 시켜볼 수 있는 테스트가 가능하며 다음과 같이             2기가 -> 4기가까지 늘어나는 것을 확인 할 수 있다.

 

이제 설정 값에 따라 힙 메모리가 잘 설정되고 동작하는 것을 확인을 하였다. 하지만 여기서 한가지 궁금증이 생긴다. ‘-Xms 값과 -Xmx 값을 어떻게 주는 것이 좋을까’ 라는 생각이다.

 

 

-Xms 값과 -Xmx 값 설정


방법에는 두가지 경우가 있을 것이다.

 

위에서 예제와 같이 -Xms 값과 -Xmx 값을 다르게 주는 경우와 동일하게 주는 경우다.

 

먼저 -Xms 값과 -Xmx 값에 대해서 어떻게 줘야한다라고 정답은 없다. 왜냐하면 상황에 따라 다를 것이기 때문이다.

 

하지만 일반적으로 -Xms 값과 -Xmx 값을 같은 값으로 설정하는 것이 좋다고 한다. -Xms 값과 -Xmx 값을 동일하게 지정하면 JVM이 시작 시 애플리케이션에 필요한 전체 힙 메모리 양을 할당하게 되고 이렇게 하면 운영 체제에서 지속적으로 추가 메모리를 요청해야 하는 JVM의 오버헤드를 줄이는 데 도움이 되기 때문이다.

 

반대로 다르게 주는 경우에서는 최대값까지 힙메모리 양을 자주 사용하지는 않지만 사용할 수도 있는 경우에서는 굳이 동일하게 주는 것보다 다르게 주는 것이 좋을 수도 있다.

 

이처럼 힙메모리 사이즈 설정은 애플리케이션에 따라 다를 수 있으니 성능 테스트를 통해 최적의 설정 값을 찾아내는 것이 중요하다.

 

 

추가적으로 해당 글에서 사용 된 VisualVM에 대해서 궁금하다면 아래 글을 참고하길 바란다.

 

VisualVM을 통한 원격 서버 도커 내 JVM 성능 모니터링

 

VisualVM을 통한 원격 서버 도커 내 JVM 성능 모니터링

메모리 관련 이슈가 발생하여 (java.lang.OutOfMemoryError: Java heap space) 원인 분석을 위해 VisualVM을 사용하였고 해당 내용을 정리한다. OutOfMemoryError: Java heap space 가 발생한다면 힙 메모리의 사이즈를 늘

sjparkk-dev1og.tistory.com