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