웹 개발

java에서 메모리 문제가 발생할 경우 사용해볼 수 있는 메모리 옵션

노루아부지 2020. 11. 29. 21:14
반응형
  • -Xms<size>
    • Java Heap의 최초 크기를 지정합니다.
    • Java Heap은 -Xms 옵션으로 지정한 크기로 시작하며, 최대 -Xmx 옵션으로 지정한 크기만큼 커집니다.
    • Java8에서 이 옵션은 Deprecated 되었습니다.
  • -Xmx
    • Java Heap의 최대 크기(Maximum size)를 지정합니다.
    • -Xms 옵션으로 지정한 크기로 시작하며 최대 -Xmx 옵션으로 지정한 만큼 커집니다.
    • Sun HotSpt JVM 계열에서는 최초 크기와 최대 크기를 동일하게 부여할 것을 권장합니다. 그 이유는 크기의 동적인 변경에 의한 오버헤드를 최소화하기 위해서입니다.
    • Java8에서 이 옵션은 Deprecated 되었습니다.
  • -XX:PermSize=<size>
    • Permanent Generation의 최초 크기를 지정합니다. Permanent Geeneration의 최대 크기는 MaxPermSize 옵션에 의해 지정됩니다.
    • 많은 수의 Class를 로딩하는 Application은 Permanent Generation을 필요로 하며, Permanent Generation의 크기가 작아서 Class를 로딩하지 못하면 Out of Memory Error가 발생합니다.
  • -XX:MaxPermSize=<size>
    • Permanent Generation의 최대 크기를 지정합니다. Permanent Generation의 시작 크기는 PermSize 옵션에 의해 지정됩니다.
    • 많은 수의 Class를 로딩하는 Application은 PermSize와 MaxPermSize 옵션을 이용해 Permanent Generation의 크기를 크게 해주는 것이 좋습니다.
    • Permanent Generation의 크기가 작아서 Class를 로딩하지 못하면 Out of Memory Error가 발생합니다.
  • -XX:NewSize<size>
    • 객체가 생성되어 저장되는 초기 공간의 Size로 Eden+Survivor 영역
  •  -XX:MaxMetaspaceSize
    • Perm 영역은 Class의 Meta 정보, Method의 Meta 정보, Static 변수와 상수 정보 저장되는 공간. 흔히 메타데이터 저장 영역이라고 합니다.
    • 이 영역은 Java 8부터는 Native memory 영역으로 이동하여 Metaspace 영역으로 명명되었다고 합니다.
    • Default jvm MaxMetaspaceSize = None
    • 별도로 사이즈를 지정하지 않으면 JVM이동적으로 알아서 조정한다고 하는데, 문제는 그냥 default로 하게 되면 크나큰 장애에 직면하게 될 수도 있다는 것입니다.
      • 장애 상황 시 Metaspacce가 끊임없이 증가하다가 JVM이 죽는 문제가 발생할 수 있습니다. 하지만 MaxMetaspaceSize를 지정하면 GC가 정상 동작하여 끊임없이 증가하는 현상이 없어지게 됩니다.
      • 과거 JDK8u40 미만에서 JVM 옵션으로 CMSClassUnloadingEnabled가 정의되지 않았을 때 FullGC가 수행되지 않았던 현상에 대한 bug report를 보면 bugs.openjdk.java.net/browse/JDK-8049831 를 보면 아래와 같은 글이 있습니다.
      • MaxMetaspaceSize에 도달하게 되면, 클래스들에 대한 metadata를 메모리에서 release 하게 되는데, 해당 설정이 없기 때문에 metadata에 대한 release를 하지 못했고, 그로 인해 적절한 Full GC가 발생하지 못했다는 것입니다.

[참고자료]

brunch.co.kr/@heracul/1

elfinlas.github.io/2018/06/08/jvm-memory-out/

blog.voidmainvoid.net/184

bugs.openjdk.java.net/browse/JDK-8049831

728x90
반응형
loading