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
'· LANGUAGE > └ Java' 카테고리의 다른 글
| Java 메모리 구조, OOM 원인 (Heap / PermGen / Metaspace 차이) (0) | 2026.04.25 |
|---|---|
| [ Java / Socket ] 통신 흐름 이해 (0) | 2024.06.30 |
| [ Java / Socket ] JSON을 이용하여 소켓 통신 (비회원 채팅, 익명채팅) (0) | 2024.06.30 |
| Heartbeat, Live Ping (0) | 2024.06.29 |
| [ Java / Socket ] 접속자 제어 및 브로드캐스팅(그룹채팅 구현) (0) | 2024.06.29 |