1. PermGen

1-1. 정의

JAVA7까지 사용된 메모리 개념으로 주로 다음 내용이 저장된다.

  • Class, static 정보등의 정적 정보
  • String Constant Pool

1-2. 메모리상 위치

  • Heap 내부에 위치한다.

1-3. 튜닝 옵션

-XX:PermSize=N --> PermGen Default Size 설정
-XX:MaxPermSize=N --> PermGen Max Size 설정

2. Metaspace

Java8부터 JVM의 메모리 영역 중 Permanent Generation 메모리 영역이 사라지고 Metaspace 영역이 생겼다.

2-1. 정의

  • class 메타정보, static등의 정적 정보
  • String Constant pool이 포함되지 않는다.

2-2. 메모리상 위치

  • Native Memory내에 위치한다.
  • 커널이 관리하기 때문에 메모리 관리 복잡성이 줄었다.

2-3. 튜닝 옵션

-XX:MetaspaceSize=N --> Metaspace Default Size 설정
-XX:MaxMetaspaceSize=N --> Metaspace Max Size 설정

3. PermGen 이 사라지고 Metaspace로 바뀐 이유

3-1. 메모리 관리 측면

  • JVM의 메모리는 크게 두가지 영역으로 구분된다.
    JVM Heap + 정적메타데이터:PermGen(Metaspace)

Metaspace 영역은 JVM에 의해 관리되는 Heap이 아닌 OS 레벨에서 관리되는 Native 메모리 영역이다. 그러므로 Metaspace가 Native 메모리를 이용함으로서 개발자는 영역 확보의 상한을 크게 의식할 필요가 없어지게 되었다.

따라서 “java.lang.OutOfMemoryError: PermGen space”과 같은 종류의 OOM은 더 이상 마주칠 일이 없으며, -Xmx option에 의해 설정되는 Heap사이즈가 아닌, Host 운영시스템에 의해서 그 사이즈가 제약된다.

4. 메모리 튜닝 팁

위의 내용을 정리해 보면 Java 어플리케이션은 크게 Heap과 Metaspace 두 공간을 활용하여 동작한다.

그러므로 어플리케이션 메모리를 결정하기 위해서는 다음 3가지를 모두 고려하여 설정해야한다.

1)Xmx(Heap 메모리 최대치를 결정하는 Java 옵션)
2) Metaspace
3) 프로그램에서 NIO(Non-blocking I/O)를 통해 Native Memory를 직접 할당받는 로직

정리

  • Java7에서 Java8으로 넘어오면서 PermGen 이 사라지고 Metaspace로 바뀌었으며 static, class메타정보가 native memory에 저장되게 되었다.
  • 그 이유는 메모리 관리로 인한 어려움과 OOM등의 에러 발생을 줄이기 위해서이다.

출처

profile
Fail Fast

0개의 댓글

Powered by GraphCDN, the GraphQL CDN