..

JVM Minor GC: Eden을 비우고 살아남은 객체를 옮기는 과정

TOC


  1. Overview
  2. Minor GC란?
  3. Eden은 어떻게 정리되는가
  4. 생존 여부는 어떻게 판별하는가
  5. 살아남은 객체는 어디로 가는가
  6. Conclusion
  7. Next Step

Overview


앞 글인 JVM new와 Eden: 객체가 처음 할당되는 곳에서는 객체가 보통 Eden에서 시작한다는 흐름을 다뤘다.

그다음 질문은 이것이다.

Eden에 들어간 객체들은 언제, 어떤 기준으로 누가 정리할까?

이 글에서는 Minor GCEden을 비우고, 살아남은 객체를 Survivor로 옮기는 기본 흐름만 짧게 정리한다.

Minor GC란?


Minor GCYoung Generation을 대상으로 하는 가비지 컬렉션 동작이다.

이 단계의 목적은 Eden에 쌓인 객체 중 더 이상 참조되지 않는 객체를 정리하고, 아직 살아 있는 객체만 다음 공간으로 옮기는 데 있다.

Eden은 어떻게 정리되는가


Eden이 가득 차면 Minor GC가 시작된다.

이때 JVM은 살아 있는 객체와 죽은 객체를 구분한다. 더 이상 참조되지 않는 객체는 정리 대상이 되고, 여전히 참조되는 객체는 이동 대상이 된다.

정리의 핵심은 Eden 전체를 개별 객체 단위로 오래 관리하는 것이 아니라, 생존 여부를 빠르게 판정한 뒤 남길 것만 남기는 것이다.

생존 여부는 어떻게 판별하는가


Minor GCGC Roots에서 도달 가능한 객체만 살아 있는 것으로 본다.

도달할 수 없으면 정리 대상, 도달할 수 있으면 이동 대상이다.

살아남은 객체는 어디로 가는가


Eden에서 살아남은 객체는 보통 Survivor 영역으로 이동한다.

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

    class S0 survivorStyle

    classDef survivorStyle fill:#fff3cd,stroke:#f59e0b,stroke-width:4px,color:#111,font-weight:bold

Survivor는 아직 오래 살지는 않았지만 당장 버릴 수 없는 객체를 잠시 받아두는 공간이다. 이후 여러 번의 Minor GC를 거치며 더 오래 살아남으면 Old Generation으로 승격될 수 있다.

Conclusion


Minor GCEden을 비우고 살아 있는 객체만 옮기는 작업이다.

  • 죽은 객체는 정리된다.
  • 살아 있는 객체는 Survivor로 이동한다.
  • 여러 번 살아남은 객체는 나중에 Old Generation으로 승격될 수 있다.

한 줄로 정리하면 이렇다.

Minor GCEden을 정리하고, 살아 있는 객체를 다음 생존 공간으로 옮기는 과정이다.

Next Step


다음 글에서는 Survivor에서 객체가 어떻게 살아남고, 언제 Old Generation으로 승격되는지 이어서 본다.