JAVA -Xms -Xmx 등 메모리 설정

Q·2022년 12월 1일
0

JAVA 관련 CS

목록 보기
2/4

-Xms

  • -Xms이 설정은 Java 힙의 초기 크기를 제어합니다. 이 매개변수를 적절하게 조정하면 가비지 콜렉션의 오버헤드를 줄여서 서버 응답 시간 및 처리량을 개선합니다. 일부 응용프로그램의 경우, 이 옵션에 대한 기본 설정이 너무 낮아서 사소한 가비지 콜렉션의 수가 높아질 수 있습니다.

    기본값 : 50MB. 이 기본값은 31비트 및 64비트 구성 모두에 적용됩니다.
    권장 : 워크로드에 특정하지만, 기본값보다 높습니다.
    사용법 : -Xms256m은 초기 힙 크기를 256MB로 설정합니다.

-Xmx

  • -Xmx이 설정은 Java 힙의 최대 크기를 제어합니다. 이 매개변수를 늘리면 Application Server에 사용 가능한 메모리가 늘어나고 가비지 콜렉션 빈도가 줄어듭니다. 이 설정을 늘리면 서버 응답 시간 및 처리량이 개선될 수 있습니다. 그러나 이 설정을 늘리면 가비지 콜렉션이 발생할 때 해당 콜렉션의 지속 기간이 늘어납니다. 이 설정은 Application Server 인스턴스에 대해 사용 가능한 시스템 메모리 이상으로 증가해서는 안됩니다. 설정을 사용 가능한 시스템 메모리 이상으로 늘리면 시스템 페이징 및 상당한 성능 감소를 유발할 수 있습니다.

    기본값 : 256MB. 이 기본값은 31비트 및 64비트 구성 모두에 적용됩니다.
    권장 : 워크로드에 특정하지만, 사용 가능한 실제 메모리의 양에 따라서 기본값보다 높습니다.
    사용법 : -Xmx512m은 최대 힙 크기를 512MB로 설정합니다.

-XX:NewRatio

  • -XX:NewRatio 옵션을 이용해 전체 힙 크기 중 New 크기의 비율을 지정하거나 XX:NewSize 옵션을 사용해 원하는 크기만큼의 New 영역 크기를 지정하는 것이 좋다. 대부분의 객체는 생존 시간이 길지 않기 때문에 New 영역 크기 지정이 중요해진다. 웹 애플리케이션에서 캐시 데이터를 제외한 대부분의 객체는 HttpRequest에 대한 HttpResponse가 만들어지는 시간에 생성된다. 보통 이 시간은 1초를 넘지 않기 때문에 객체의 생존 시간도 1초가 되지 않는다. 만약 New 영역의 크기가 크지 않다면 새로 생성되는 객체의 자리를 위해 Old 영역으로 이동돼야 하고 Old 영역에 대한 GC 비용은 New 영역에 대한 GC 비용보다 상당히 크기 때문에 충분한 New 영역의 크기를 잡아줘야 한다.

    다만 일정 수치 이상으로 New 영역의 크기가 커지면 응답 반응성이 떨어지는 문제가 발생할 수 있으므로 주의하자. New 영역에 대한 GC는 기본적으로 어느 한 Survivor 영역에서 다른 Survivor 영역으로 복사하는 것이기 때문이다. 또한 Old 영역뿐만 아니라 New 영역에 대한 GC를 할 때에도 stop-the-world 현상은 발생한다. New 영역이 커지면 상대적으로 Survivor 영역의 크기도 커져 그만큼 복사해야 할 데이터의 크기도 늘어난다. 이런 특성을 감안해 New 영역의 크기를 정할 때는 HotSpot JVM의 OS별 NewRatio를 참고하는 것이 좋다.

    OS & option디폴트 -XX:NewRatio
    Sparc-server2
    Sparc-client8
    x86-server8
    x86-client12

    NewRatio를 지정하면 전체 힙 크기 중에서 1/(NewRatio+1) 만큼이 New 영역의 크기가 된다.
    Sparc-server의 NewRatio가 유독 작은 것을 알 수 있는데 기본값을 정하던 당시 x86보다 Sparc 시스템을 하이엔드 용도로 사용했기 때문이다. 요즘은 x86 서버 사용이 흔해졌고 성능 또한 향상됐기 때문에 Sparc-server에 준하는 값인 2 또는 3 정도를 지정하는 것이 좋다.

-Djava.net.preferIPv4Stack

  • Java는 OS에서 IPv4와 IPv6를 모두 사용 가능할 경우 IPv6를 우선적으로 사용하게 된다. 그래서 netstat 등의 명령어를 사용해서 네트워크 정보를 볼 경우나 Java에서 request.getRemoteAddr() 함수 호출 시 IPv6로 보이게 된다. IPv6 주소는 익숙하지가 않고 보기도 어려우므로 Java 의 System Property 를 수정하면 IPv4 를 우선적으로 사용하게 설정할 수 있다.
    • java.net.preferIPv4Stack (default: false)
    • Java VM 을 구동할 때 다음 옵션을 추가한다.
    • Djava.net.preferIPv4Stack=true
profile
Data Engineer

0개의 댓글