궁금한점


1.8 버전부터 메소드 영역을 힙메모리(**PermGen)**에서 네이티브메모리(Metaspace)로 바뀌었는데 바뀐 이유와 장점은?

  1. Heap GC 부담 감소

    • 클래스 메타데이터가 많으면 Full GC가 더 자주 발생

  2. PermGen Size 튜닝 문제 해결

    • -XX:PermSize -XX:MaxPermSize 로 힙 메모리 안에서 사이즈 설정이 필요

    • Metaspace는 기본적으로 OS 메모리를 사용하기 때문에 필요한 만큼 자동 확장이 가능함.

  3. ClassLoader Leak 대응 개선

ClassLoader Leak 문제란?

ClassLoader가 더 이상 사용되지 않는데도 GC되지 못해, 그 ClassLoader가 로드한 클래스 메타데이터와 객체들이 계속 메모리에 남아 있는 문제

기존 문제점

ClassLoader leak ↓ PermGen OOM ↓ 서버 죽음

Metaspace는 GC와 메모리 확장이 더 유연


Java에서는 객체 생성이 생각보다 매우 빠른이유는?

  1. TLAB (Thread Local Allocation Buffer)

  2. Bump-the-pointer Allocation

    JVM의 Young Generation은 대부분 연속된 메모리 공간이기 때문에 objectSize 크기만큼 포인터를 더하면 bump 위치를 찾을수 있습니다.

  3. Generational GC 전략

    생명주기로 gc를 분류하였습니다. 대부분의 객체는 Eden에서 생성되고 바로 GC됩니다.

    new → Eden → Survivor → Old (long-lived)

  4. Escape Analysis + Scalar Replacement

    JIT 컴파일러가 객체 자체를 제거하는 경우도 있습니다.

객체 생성 흐름