JVM Minor GC: Eden을 비우고 살아남은 객체를 옮기는 과정
TOC
Overview
앞 글인 JVM new와 Eden: 객체가 처음 할당되는 곳에서는 객체가 보통 Eden에서 시작한다는 흐름을 다뤘다.
그다음 질문은 이것이다.
Eden에 들어간 객체들은 언제, 어떤 기준으로 누가 정리할까?
이 글에서는 Minor GC가 Eden을 비우고, 살아남은 객체를 Survivor로 옮기는 기본 흐름만 짧게 정리한다.
Minor GC란?
Minor GC는 Young Generation을 대상으로 하는 가비지 컬렉션 동작이다.
이 단계의 목적은 Eden에 쌓인 객체 중 더 이상 참조되지 않는 객체를 정리하고, 아직 살아 있는 객체만 다음 공간으로 옮기는 데 있다.
Eden은 어떻게 정리되는가
Eden이 가득 차면 Minor GC가 시작된다.
이때 JVM은 살아 있는 객체와 죽은 객체를 구분한다. 더 이상 참조되지 않는 객체는 정리 대상이 되고, 여전히 참조되는 객체는 이동 대상이 된다.
정리의 핵심은 Eden 전체를 개별 객체 단위로 오래 관리하는 것이 아니라, 생존 여부를 빠르게 판정한 뒤 남길 것만 남기는 것이다.
생존 여부는 어떻게 판별하는가
Minor GC는 GC 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 GC는 Eden을 비우고 살아 있는 객체만 옮기는 작업이다.
- 죽은 객체는 정리된다.
- 살아 있는 객체는
Survivor로 이동한다. - 여러 번 살아남은 객체는 나중에
Old Generation으로 승격될 수 있다.
한 줄로 정리하면 이렇다.
Minor GC는 Eden을 정리하고, 살아 있는 객체를 다음 생존 공간으로 옮기는 과정이다.
Next Step
다음 글에서는 Survivor에서 객체가 어떻게 살아남고, 언제 Old Generation으로 승격되는지 이어서 본다.