JAVA7까지 사용된 메모리 개념으로 주로 다음 내용이 저장된다.
-XX:PermSize=N --> PermGen Default Size 설정
-XX:MaxPermSize=N --> PermGen Max Size 설정
Java8부터 JVM의 메모리 영역 중 Permanent Generation 메모리 영역이 사라지고 Metaspace 영역이 생겼다.
-XX:MetaspaceSize=N --> Metaspace Default Size 설정
-XX:MaxMetaspaceSize=N --> Metaspace Max Size 설정
Metaspace 영역은 JVM에 의해 관리되는 Heap이 아닌 OS 레벨에서 관리되는 Native 메모리 영역이다. 그러므로 Metaspace가 Native 메모리를 이용함으로서 개발자는 영역 확보의 상한을 크게 의식할 필요가 없어지게 되었다.
따라서 “java.lang.OutOfMemoryError: PermGen space”과 같은 종류의 OOM은 더 이상 마주칠 일이 없으며, -Xmx option에 의해 설정되는 Heap사이즈가 아닌, Host 운영시스템에 의해서 그 사이즈가 제약된다.
위의 내용을 정리해 보면 Java 어플리케이션은 크게 Heap과 Metaspace 두 공간을 활용하여 동작한다.
그러므로 어플리케이션 메모리를 결정하기 위해서는 다음 3가지를 모두 고려하여 설정해야한다.
1)Xmx(Heap 메모리 최대치를 결정하는 Java 옵션)
2) Metaspace
3) 프로그램에서 NIO(Non-blocking I/O)를 통해 Native Memory를 직접 할당받는 로직