시냅스

JVM 의 Xmx 와 Xms 를 지정해야 하는 이유에 대해 본문

Java, Spring

JVM 의 Xmx 와 Xms 를 지정해야 하는 이유에 대해

ted k 2023. 3. 2. 22:35

https://www.digitalocean.com/community/tutorials/java-jvm-memory-model-memory-management-in-java

 

JVM -Xmx, -Xms option

 

java -Xms2048m -Xmx2048m -jar app.jar

 

Xmx 와 Xms 는 사용할 최대, 최초 힙 크기를 지정하는 데 사용됩니다.

  • Xmx
    • Java 프로세스에서 사용 가능한 최대 힙 크기 설정
    • 설정하지 않으면 기본적으로 시스템 물리적 메모리 크기에 따라 결정
  • Xms
    • Java 프로세스에서 사용 가능한 최초 힙 크기를 설정
    • 설정하지 않으면 Xmx 와 동일하게 설정

 

 

Xmx 와 Xms 는 왜 지정해야 할까?

JVM은 메모리가 부족하게 되면 OS에 메모리를 추가 요청하는 방식으로 힙 사이즈를 조정합니다.

이때 GC 가 발생하게 되고, JVM은 필요한 만큼 힙사이즈를 늘려가게 됩니다.

이렇게 조정하다가 만약 머신의 물리 메모리 사이즈를 넘어가게 되면

가상 메모리를 사용하면서 swap space로 swap in - out 을 하게 됩니다.

 

https://liltdevs.tistory.com/93

 

가상 메모리, Virtual Memory

Chapter 10 Virtual Memory 물리 메모리와 논리 메모리를 완전히 분리하여 프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법이다. 가상 메모리를 정의하고 그 이점을 설명

liltdevs.tistory.com

 

이때 swap 영역은 Disk가 되므로 오버헤드가 발생합니다.

swap 영역인 Disk에 읽기 쓰기를 하고,

동시에 GC도 발생한다면 꽤 큰 성능이슈가 있을 것으로 예상됩니다.

 

또한, Xmx 와 Xms가 동일하지 않을 때에도 문제는 발생할 수 있습니다.

Xms 가 너무 작은 경우 빈번한 GC를 수행하고,

이 때 메모리를 추가 요청하면서 결국 Xmx와 동일한 사이즈를 갖게 됩니다.

 

그러므로, 한 머신에서 여러 대의 서버를 실행 중이며

애플리케이션에서 큰 사이즈의 메모리를 사용할 것으로 예상된다면

합리적인 Xmx, Xms 설정을 할 수 있어야겠습니다.

 

 

log 를 위한 vm option 들

 

  1. verbose:gc
    • JVM에서 GC 이벤트가 발생할 때마다 간단한 로그 메시지를 출력
  2. Xlog:gc
    • 상세한 GC 로그를 출력
    • 출력 형식은 다양한 방법으로 구성
    • -Xlog:gc* 를 사용하면 GC 로그의 상세한 정보를 출력
  3. Xlog:gc+heap=debug
    • GC와 관련된 메모리 사용 정보를 출력
    • 이 옵션을 사용하면 GC 로그와 함께 Heap 정보도 출력
  4. XX:+PrintGCDetails
    • GC 이벤트에 대한 자세한 정보를 출력
    • 이 옵션을 사용하면 GC 로그가 상세하게 출력
  5. XX:+PrintGCDateStamps
    • GC 이벤트가 발생한 시간을 출력
  6. XX:+PrintHeapAtGC
    • GC 이벤트 발생 시점에서 Heap 사용 정보를 출력
  7. XX:+PrintTenuringDistribution
    • 적극적인 GC 및 비적극적인 GC의 세부 정보를 출력
Comments