자바/자바

(자바) JVM 메모리 관리와 GC, 객체 동작 핵심 정리 *널널한 개발자

불광동 물주먹 2025. 9. 9. 14:01

JVM 메모리 관리와 GC, 객체 동작 핵심 정리

1. 세대 단위 컬렉션(Generational Collection) 이론

  • 약한 세대 가설(Weak Generational Hypothesis)
    → 대부분의 객체는 일찍 사라진다. (지역 스코프 변수, 임시 객체 등)
  • Age bit
    → Young 영역(Survivor space)에 있는 동안 살아남을 때마다 age 값 증가.
    → age 값이 일정 이상이면 Old 영역으로 승격(Promotion).
  • 세대 간 참조 가설
    → 서로 다른 세대 간의 참조는 드물고, 같은 세대 내에서 참조가 많다.

Survivor 영역이 2개인 이유

  • GC 후 남은 객체를 압축(Compaction) 하여 파편화를 막고, 효율적으로 재배치하기 위함.
  • Eden → Survivor0 → Survivor1 식으로 교체하면서 객체를 정리.
  • mark-sweep-compact

2. GC 기본 메커니즘

  • Mark and Sweep
    • Mark: 루트에서부터 도달 가능한 객체 표시.
    • Sweep: 마크되지 않은 객체 제거.
  • 도달 가능성 분석(Reachability Analysis)
    GC Root로부터 도달 가능한지 여부로 생존 판정.

GC Root의 예시

  1. JVM 스택의 지역변수 테이블에서 참조하는 객체
  2. synchronized 로 잠긴 모니터 객체
  3. JNI에서 참조하는 객체
  4. 클래스의 static 필드에서 참조하는 객체
  5. 클래스의 static final 상수에서 참조하는 객체
  6. JVM 내부에서 사용 중인 객체

📌 주의:
정적 필드가 다른 객체를 참조하면 그 객체는 GC 되지 않을 수 있다.


3. GC 종류와 발생 조건

  • Minor GC: Young 영역(Eden+Survivor)이 가득 찼을 때 발생.
  • Major GC: Old 영역이 가득 찼을 때 발생.
  • Full GC: Old 영역 또는 Metaspace가 가득 찼을 때 발생.
  • G1GC:
    • 세대 구분이 아니라 힙 전체를 Region 단위로 나눔.
    • 수집 효율이 좋은 영역부터 회수.
    • 대용량 힙에서 지연시간을 줄이기 위한 목적.

4. GC 튜닝 포인트

  • 서비스 특성에 맞게 Young/Old/Metaspace 크기 조정.
  • Minor/Full GC 발생 빈도를 모니터링하고 조율.
  • 필요시 GC 알고리즘(Parallel, CMS, G1 등) 변경 고려.

5. 객체 구성 (JOL: Java Object Layout)

  • Object Header
    • Mark Word: 해시코드, age, lock flag 등 저장.
    • Klass Word: Metaspace의 클래스 메타데이터 참조.
    • Length: 배열일 경우 길이 저장.
  • Instance Data: 실제 필드 값.
  • Padding: 정렬을 위한 여유 공간.

6. 락과 동기화

  • Lock flag 와 상태 정보는 Mark Word에 저장됨.
  • 동기화 방식:
    • 스핀락(Spin Lock): CPU 반복 대기로 처리, 경량(lock 경쟁이 짧을 때).
    • 뮤텍스(Mutex): OS 커널 수준 락, 무겁지만 안정적.

7. HashCode 부여 시점

  • 객체 생성 시점에는 아직 해시코드가 부여되지 않음.
  • .hashCode() 호출 시점에 JVM이 생성하여 Mark Word에 저장.

8. 동등성과 동일성

  • 동일성(Identity): 참조가 같은 객체를 가리키는지 (==).
  • 동등성(Equality): 객체의 내용이 같은지 (equals).
  • 컬렉션, String 등은 equals/hashCode 가 이미 재정의되어 있음.
  • 커스텀 객체에서 동등성 비교를 하려면 equals와 hashCode 반드시 재정의.
  • Lombok을 쓰면 자동으로 재정의 가능.