JDK 11에서 PermGen 경고가 발생하는 이유 (Metaspace 개념 정리)

2026. 4. 24. 19:43· LANGUAGE/└ Java

 

요약: 

PermGen 

  • heap 내부
  • JVM이 크기 통제

Metaspace

  • Heap 외부
  • OS 메모리 한도까지 확장 가능
    즉, Metaspace 최대치 = (MaxMetaspaceSize 설정 없으면) 서버 RAM 한도까지

Tomcat을 실행하다 보면 아래와 같은 JVM 옵션을 종종 볼 수 있습니다.

-XX:PermSize=256m
-XX:MaxPermSize=512m

그런데 JDK 11 환경에서는 이 옵션 때문에 경고가 발생할 수 있습니다.
이유는 간단합니다. PermGen이 더 이상 존재하지 않기 때문입니다.

 


1. PermGen이란?

PermGen(Permanent Generation)은 Java 7까지 사용되던 메모리 영역입니다.

이 영역에는 다음과 같은 정보가 저장됩니다.

  • 클래스 메타데이터
  • 메서드 정보
  • static 변수

문제는 이 영역의 크기가 고정되어 있어서, 부족할 경우 OutOfMemoryError가 발생할 수 있다는 점입니다.

그래서 JVM 옵션으로 크기를 지정했습니다.

-XX:PermSize
-XX:MaxPermSize

2. Java 8부터 변경된 구조 (Metaspace)

Java 8부터는 PermGen이 완전히 제거되고, Metaspace로 대체되었습니다.

Metaspace의 특징은 다음과 같습니다.

  • JVM 내부가 아닌 OS 메모리를 사용
  • 필요에 따라 자동으로 확장
  • 기본적으로 크기 설정이 필요 없음

즉, 기존보다 훨씬 유연한 구조로 변경되었습니다.


3. 왜 경고가 발생하는가?

JDK 11은 Metaspace 구조를 사용합니다.
그런데 설정 파일(setenv.sh 등)에 여전히 아래 옵션이 남아 있다면:

-XX:PermSize
-XX:MaxPermSize

이 옵션은 더 이상 존재하지 않기 때문에 JVM이 경고를 출력합니다.


4. 해결 방법

방법 1. PermGen 옵션 제거 (권장)

아래 옵션을 삭제합니다.

-XX:PermSize
-XX:MaxPermSize

대부분의 경우 이것만으로 충분합니다.


방법 2. Metaspace 크기 지정 (필요한 경우)

메모리 사용을 제한해야 한다면 아래 옵션을 사용할 수 있습니다.

-XX:MetaspaceSize=512m
-XX:MaxMetaspaceSize=512m

특히 컨테이너 환경(Docker 등)에서는 유용합니다.

 

혹은 다음과 같이 등록

-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:MaxMetaspaceSize=512m

 

옵션 의미 핵심 요약
-XX:+UseG1GC G1 GC 사용 최신 방식으로 메모리 효율적으로 정리
-XX:MaxGCPauseMillis=200 GC 일시정지 목표 시간 설정 멈춤 시간을 약 200ms 이하로 유지하려고 시도
-XX:MaxMetaspaceSize=512m Metaspace 최대 크기 제한 클래스 메모리를 512MB까지만 사용

5. 정리

  • Java 7까지 → PermGen 사용
  • Java 8 이상 → Metaspace 사용
  • PermGen 관련 옵션은 더 이상 사용 불가
  • 필요 시 Metaspace 옵션으로 대체

참고

728x90