Java 메모리 구조, OOM 원인 (Heap / PermGen / Metaspace 차이)
2026. 4. 25. 17:50ㆍ· LANGUAGE/└ Java
1. 개요
Java 서비스 운영 중 OutOfMemoryError(OOM)를 경험하면서
Heap, PermGen, Metaspace의 역할과 차이를 정리.
2. Heap 메모리
✔ 역할
- 실제 애플리케이션 데이터 저장
- 객체, 배열, 컬렉션 등
✔ 특징
- GC(가비지 컬렉션) 대상
- JVM 메모리 중 가장 중요
✔ 설정 옵션
-Xms (초기 힙 크기)
-Xmx (최대 힙 크기)
✔ OOM 발생 형태
java.lang.OutOfMemoryError: Java heap space
👉 대부분의 OOM은 여기서 발생
이런 경우 해당 프로세스의 -Xms -Xmx 설정값을 상황에 맞게 조절하여 재기동 시 해소 된다.
3. PermGen (Java 7까지)
✔ 역할
- 클래스 메타데이터 저장
- 클래스 구조, 메서드 정보, static 변수
✔ 특징
- Heap과 별도 영역
- 크기 제한 필요
✔ 설정 옵션
-XX:PermSize
-XX:MaxPermSize
✔ OOM 발생 형태
OutOfMemoryError: PermGen space
❗ 문제점
- 크기 튜닝 어려움
- WAS(톰캣) 환경에서 OOM 자주 발생
4. Metaspace (Java 8 이후)
✔ 역할
- PermGen을 대체
- 클래스 메타데이터 저장
✔ 특징
- Heap 밖 (Native Memory 사용)
- 기본적으로 자동 확장
✔ 설정 옵션
-XX:MaxMetaspaceSize
✔ OOM 발생 형태
OutOfMemoryError: Metaspace
5. 구조 비교
✔ Java 7
Heap (-Xmx)
├─ Young
└─ Old
PermGen (별도 영역)
✔ Java 8+
Heap (-Xmx)
├─ Young
└─ Old
Metaspace (Native Memory)
6. 핵심 차이
| 구분 | PermGen | Metaspace |
| 위치 | JVM 내부 | OS 메모리 |
| 크기 | 고정 | 자동 확장 |
| 관리 | 직접 설정 필요 | 거의 자동 |
| 안정성 | 낮음 | 높음 |
7. 실무 관점에서의 OOM 원인
✔ Heap OOM (가장 흔함)
- 트래픽 증가
- 객체 누적
- 캐시/세션 증가
해결: -Xmx 증가 또는 구조 개선
✔ Metaspace OOM
- 클래스 로딩 과다
- 클래스 로더 누수
해당 이슈는 드물게 발생한다.
8. 결론
- Heap → 실제 데이터 처리
- Metaspace → 클래스 정보 저장
- 두 영역은 서로 독립적
대부분의 OOM은 Heap 부족 문제
728x90
'· LANGUAGE > └ Java' 카테고리의 다른 글
| JDK 11에서 PermGen 경고가 발생하는 이유 (Metaspace 개념 정리) (0) | 2026.04.24 |
|---|---|
| [ 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 |