..

JVM heap 구조와 객체 배치: Young, Old, Eden, Survivor

TOC


  1. Overview
  2. Heap은 어떻게 나뉘는가
  3. Young Generation
  4. new는 어디로 들어가는가
  5. Conclusion

Overview


이 글은 heap이 보통 어떻게 구성되는지, 그리고 new로 만든 객체가 heap 안에서 어떤 순서로 자리를 잡고 이동하는지 가볍게 다룬다.

Young Generation, Old Generation, Eden, Survivor의 관계를 먼저 잡아두면, 다음 글에서 Eden이 왜 빠른 할당 구역이 되는지와 bump pointer가 왜 중요한지 알 수 있다.

자세한 Minor GC, Promotion, Survivor 이동 규칙은 jvm young generation에서 더 자세히 다룬다. Eden에서 객체가 처음 자리를 잡는 흐름은 JVM new와 Eden: 객체가 처음 할당되는 곳에서 이어서 본다.

flowchart TB
    Start["new"]

    subgraph Heap["Heap"]
        direction TB

        subgraph Young["Young Generation"]
            direction LR
            Eden["Eden"]
            S0["Survivor 0"]
            S1["Survivor 1"]
        end

        subgraph OldGen["Old Generation"]
            direction TB
            Old["Old / Tenured"]
        end
    end

    Start -->|new| Eden
    Eden -->|Minor GC 후 생존| S0
    S0 -->|Aging| S1
    S1 -->|Promotion| Old

Heap은 어떻게 나뉘는가


HotSpot에서 heap을 이해할 때는 보통 Young GenerationOld Generation으로 나눠 본다.

  • Young Generation: 새 객체가 먼저 들어오는 영역
  • Old Generation: 오래 살아남은 객체가 승격되어 머무는 영역

Young Generation


Young Generation은 다시 EdenSurvivor 영역으로 나뉜다.

  • Eden: 새 객체가 처음 놓이는 공간
  • Survivor 0 / 1: Eden에서 살아남은 객체가 잠시 머무는 공간

new는 어디로 들어가는가


new로 만들어진 객체는 보통 Eden에서 시작한다.

그 뒤의 상세한 이동, 나이 증가, 승격은 jvm young generation에서 이어서 보면 된다.

Conclusion


heap은 단순히 “큰 메모리 덩어리”가 아니다.

새 객체가 먼저 들어오는 Young Generation, 오래 사는 객체가 쌓이는 Old Generation, 그리고 그 사이를 오가는 EdenSurvivor를 나눠서 보면, 이후의 할당 경로와 GC 설명이 훨씬 읽기 쉬워진다.