본문으로 바로가기
반응형

OutOfMemoryError: Java heap space...

해당 로그로 알람이 와서 Java -Xms -Xmx 옵션을 추가해 재기동을 진행하기로 했습니다.

해당 서버에는 여러개의 가상서버로 분할하여 사용하고 있습니다.

Xms, Xmx 옵션

  • -Xms는 Java 힙의 최초 크기 지정
  • -Xmx는 Java 힙의 최대 크기 지정
  • -Xms로 지정한 메모리 크기로 시작하여 -Xmx로 지정한 메모리 크기까지 커지게 된다.


이번에 설정한 옵션입니다.

java -Xms32g -Xmx32g -jar project.jar

heap 메모리는 32g로 시작해서 32g까지 커지게 된다.

 

Xms, Xmx default 값

  • -Xms는 물리적 메모리의 1/64의 초기 힙 크기 
  • -Xmx는 물리적 메모리의 1/4의 최대 힙 크기 

 

직접 해당 서버에서 총 메모리와 Xms, Xmx  default 값을 확인.

물리 메모리

# 명령어
cat /proc/meminfo

# 결과
MemTotal: 196338588KB
  19633859

Heap 메모리

# 명령어
java -XX:+PrintFlagsFinal -version | grep HeapSize

# 결과
uintx ErgoHeapSizeLimit                         = 0                                   {product}
uintx HeapSizePerGCThread                       = 87241520                            {product}
uintx InitialHeapSize                          := 2147483648                          {product}
uintx LargePageHeapSizeThreshold                = 134217728                           {product}
uintx MaxHeapSize                              := 32210157568                         {product}

다른 블로그에서는 맞게 하는거 같은데..default 값을 계산해보면 차이가 있다..

 

Xms, Xmx는 왜 같은 값으로 지정할까?

heap size는 JVM에서 자동으로 늘리거나 줄일수 있습니다.
Heap 메모리 사용량이 -Xms 에 다 다르면 OS에게 추가적인 메모리 할당을 요구하게 됩니다.
이렇게 해서 -Xmx 옵션으로 지정한 메모리 크기까지 메모리 할당을 받을 수 있는 것인데, OS에게 메모리 할당하는 부분에서 자주 GC(Garbage Collect)를 발생시키게 되고 이 부분에서 성능적인 이슈(애플리케이션이 일시 정지하는 병목 현상(Stop the World Event)발생)가 발생할 수 있다고 합니다.

위 이슈 때문에 물리 메모리가 넉넉하다면 초기 -Xms , -Xmx 값을 동일하게 설정하기 추천.

Xms, Xmx 사이즈는 얼마로 지정하면 좋을까?

Server 시스템의 경우 항상 최대 사용 메모리로 잡아 놓는 것이 추천한다고 합니다.
(64-bit 환경 상 물리 메모리가 32GB 초과 시스템이라도 -Xmx 옵션은 32GB 이하 설정이 적절  32GB 초과 시, 힙 관리 방식이 비효율적 방식으로 변경)

 

 

참조

반응형