[Java] 적절한 Heap사이즈 설정

🔥Log·2024년 3월 24일
0

Java

목록 보기
15/22

☕ 개요


java -Xms2048m -Xmx2048m -jar application.jar

Java로 개발한 프로그램을 실행할 때, Heap메모리의 사이즈를 지정하기 위해서 위와 같은 형태로 프로그램을 실행하곤 한다. 이는 JVM이 사용할 Heap메모리의 사이즈를 지정하는 옵션인데, 이번 글에서는 적절한 Heap메모리 설정에 대한 이야기를 해보도록 하겠다.


📒 Xms, Xmx의 의미


먼저, XmsXmx이 어떤 의미를 갖고 있는지 알 필요가 있어서, 이들에 대해서 간단히 정리해보자.

  • Xms : 이 매개변수는 Heap메모리의 초기 사이즈를 의미한다.
  • Xmx : 이 매개변수는 Heap메모리의 최대 사이즈를 의미한다.

🤔 Heap메모리를 잘!설정해야하는 이유 : GC


1) GC

JVM에서 GC는 주기적으로 메모리 내에 사용되지 않는 데이터들을 제거해주는 역할을 한다. 그런데, GC가 동작할 때는 다른 쓰레드는 멈추고, GC의 쓰레드만 동작하게 된다. 즉, 비지니스 로직들이 수행되어야하는 쓰레드들이 멈추게 되는 것이다(a.k.a Stop the world).

즉, 최대 Heap메모리 사이즈가 작게 설정이 되어 있으면, GC가 그만큼 자주 발생할 것이고 이는 성능적으로 문제가 될 수 있어서 가능하면 넉넉하게 Heap메모리를 설정해줘야한다.

2) 초기 Heap메모리와 최대 Heap메모리 사이즈

Heap메모리가 부족하면, 최대 Heap메모리 사이즈가 될때까지 추가적으로 메모리 사이즈를 할당한다.
예를 들어서 초기 Heap사이즈를 1G 최대 Heap사이즈를 4G로 설정했다고 해보자. 서비스가 구동되면서, 1G가 넘는 데이터가 Heap메모리에 할당이 된다면, 필요한만큼 Heap메모리 크기를 늘리게 될 것이다. 이 과정 자체는 정상적인 것이지만, 문제는 이 과정이 일어나면 GC가 동작하는 것이다.

즉, 추가 Heap을 요청하는 행위가 빈번하게 발생할 수록 GC도 빈번하게 발생하는 것이다.


🤓 Best practice


Heap메모리를 설정하는 것에는 물론 정답은 없다. 하지만, 일반적인 관점에서 '이렇게 하는 게 좋다'라고 할 수 있는 부분들이 있다.

1) Xms와 Xmx를 동일하게

java -Xms1024m -Xmx2048m -jar application.jar // ❌
java -Xms2048m -Xmx2048m -jar application.jar // 👍

위에서도 설명했듯이, Heap메모리 추가 요청은 최대한 발생하지 않도록 하는 것이 좋다. 초기 Heap메모리 사이즈를 최대 Heap메모리 사이즈와 동일하게 설정하면, Heap메모리 추가 요청이 발생하는 상황을 회피할 수 있어서, 최초값과 최대값을 동일하게 설정하는 것이 권장된다.

2) 비율로 메모리 사이즈 설정하기

서버의 스펙이 모든 상황에서 동일하다면, 굳이 비율(Percentage)로 메모리 사이즈를 설정해줄 필요는 없겠지만, 실제로는 매우 다양한 서버에서 동일한 서버 애플리케이션이 구동되곤 한다. 그래서 구동되는 서버마다 메모리 사이즈를 설정하는 것을 피하고, 어떤 서버에서나 동일한 수준의 메모리를 할당하고 싶다면, Heap메모리 사이즈를 비율로 설정하면 된다.

  1. -XX:InitialRAMPercentage (-Xms 옵션이 설정되어 있으면 이 옵션은 무시)

    java -XX:InitialRAMPercentage=50.0 -jar application.jar

    이 옵션은 초기 Heap메모리 사이즈를 물리 메모리에 대한 비율로 설정하는 옵션이다. 위와 같이 설정하면, 서버 메모리의 50%가 초기 Heap메모리로 할당되게 된다.

  2. -XX:MinRAMPercentage (-Xmx 옵션이 설정되어 있으면 이 옵션은 무시)

    java -XX:MinRAMPercentage=50.0 -jar application.jar

    이 옵션은 이름에서 유추되는 것과 달리 최대 메모리 사이즈를 지정하는 옵션이다. 다만, 서버가 256MB미만의 메모리를 갖고 있을 때만 이 옵션은 동작한다.

  3. -XX:MaxRAMPercentage (-Xmx 옵션이 설정되어 있으면 이 옵션은 무시)

    java -XX:MaxRAMPercentage=50.0 -jar application.jar

    이 옵션도 위와 마찬가지로 최대 Heap메모리 사이즈를 지정하는 옵션이다. 서버가 256MB이상의 메모리를 갖고 있는 경우 이 옵션은 동작한다.


🙏 참고


0개의 댓글