PermGen(Permanent Generation)이란?
PermGen은 정적 변수(static variable), 바이트코드, 클래스 메타데이터 등 클래스 관련 데이터를 저장하는 JVM의 메모리 영역입니다. 기본적으로 64MB가 할당되며, 필요에 따라 JVM 옵션인 -XX:MaxPermSize를 사용해 크기를 조정할 수 있습니다.
다만 PermGen은 고정된 크기의 힙 영역 안에 존재했기 때문에, 애플리케이션이 많은 클래스를 동적으로 로드하는 경우 java.lang.OutOfMemoryError: PermGen space 오류가 발생하기 쉬웠습니다. 이러한 한계가 Java 8에서 구조 개편의 배경이 되었습니다.
MetaSpace란?
Java 8부터 기존의 PermGen 영역은 제거되고 MetaSpace로 대체되었습니다. 클래스 메타데이터가 더 이상 JVM 힙 내부에 저장되지 않고, 운영체제(OS)의 네이티브 메모리 영역으로 분리된 것이 핵심 변화입니다.
MetaSpace는 기본 설정에서 크기가 자동으로 증가하도록 설계되어, 개발자가 상한선을 별도로 지정하지 않아도 메모리 부족 오류가 크게 줄었습니다. 또한 JVM이 실행되는 동안 클래스를 유연하게 로드(load)하고 언로드(unload)할 수 있어, 동적 클래스 생성이 잦은 환경에서도 안정적인 메모리 관리가 가능해졌습니다.
PermGen vs MetaSpace 비교표
| 번호 | 구분 | PermGen | MetaSpace |
|---|---|---|---|
| 1 | 기본 개념 | 정적 변수, 바이트코드 등 클래스 데이터를 저장하는 메모리 영역 | Java 8에서 PermGen 영역을 대체하여 도입된 새로운 메모리 구조 |
| 2 | 기본 메모리 할당 | 기본값으로 64MB 고정 할당 | 별도 설정 없이 크기가 자동으로 증가 |
| 3 | 메모리 크기 조정 옵션 | -XX:MaxPermSize 옵션으로 크기 조정 | -XX:MaxMetaspaceSize 옵션으로 메모리 상한 지정 가능 |
| 4 | 메모리 위치 | JVM 힙(Heap) 내부의 특수 공간 | Java 8부터 운영체제(OS)의 네이티브 메모리로 분리 |
핵심 정리
PermGen과 MetaSpace의 가장 큰 차이는 메모리가 존재하는 위치와 확장 방식입니다. PermGen은 힙 내부의 제한된 공간이라 OOM 오류 위험이 컸지만, MetaSpace는 네이티브 메모리를 활용하고 크기가 자동으로 늘어나므로 훨씬 유연합니다.
따라서 Java 8 이상 버전에서는 MaxPermSize 같은 구형 옵션이 무시되며, 필요하다면 -XX:MaxMetaspaceSize로 MetaSpace의 최대 크기를 명시적으로 제어하는 것이 좋습니다. 레거시 프로젝트를 마이그레이션할 때는 반드시 JVM 옵션도 함께 점검해야 합니다.