Java의 Garbage Collection(GC)은 JVM에서 자동으로 메모리를 관리하는 기능이다. GC의 동작 원리와 Java Heap 구조를 기반으로 Minor GC, Major GC를 알아보자!
Java의 Heap 메모리는 크게 Young Generation과 Old Generation으로 나뉜다.

Eden 영역과 Survivor 영역(S0, S1)으로 구성된다.
대부분의 객체는 Eden 영역에서 생성되며, 1번 이상 살아남게 되면 Survivor 영역으로 이동한다.
Minor GC가 주로 발생하는 공간이다.
new를 통해 새롭게 생성된 객체가 저장되는 공간이다.
Eden 영역이 가득 차면 Minor GC가 발생하여 살아남은 객체를 Survivor 영역으로 이동시킨다.
Young Generation에는 두 개의 Survivor 영역(S0, S1)이 있다.
Minor GC가 발생하면 Eden 영역에서 살아남은 객체가 한쪽 Survivor 영역(S0 또는 S1)으로 이동한다.
이후 Minor GC가 다시 발생하면 살아남은 객체는 다른 Survivor 영역으로 이동하며, 이 과정이 반복된다.
Survivor 영역 중 하나는 항상 비어 있어야 한다.
일정 횟수(Age) 동안 Survivor 영역에서 살아남은 객체는 Old Generation으로 이동한다.
Young Generation에서 오래 살아남은 객체들이 저장되는 공간이다.
크기가 커서 GC가 적게 발생하지만, 발생하면 시간이 오래 걸린다.
Major GC(Full GC)가 발생하는 주요 대상이다.
GC는 특정 객체가 사용되지 않는다고 판단하면 해당 객체를 메모리에서 제거한다.
이때 Reachable 이라는 개념을 사용하는데, 객체가 참조 되고 있는지 아닌지의 여부에 따라 나뉜다.
이전 글에서 Method Area나 Stack Area에서 참조되지 않는 객체들은 Unreachable 객체들이다.

Java의 GC는 Heap 영역에서 불필요한 객체를 제거하는 역할을 한다. GC는 크게 Minor GC와 Major GC(Full GC)로 나뉜다.
- Eden 영역이 꽉 차게 되면 Minor GC가 발생
- 참조되지 않는 객체들을 삭제하고 살아남은 객체들을 Survivor로 이동
- 살아남은 객체들의 Age 값 1 증가
객체가 처음 Eden 영역에 생성되면 Age(나이) 값이 0으로 설정된다.
Minor GC가 발생하면 살아남은 객체는 Survivor 영역으로 이동하며, Age 값이 증가한다.
Age 값이 일정 값(기본 값 31)을 초과하면 Old Generation으로 이동하게 된다.
Old Generation에서 발생하는 GC
Minor GC에서 살아남은 객체들이 Old Generation으로 이동하고, Old Generation이 가득 차면 실행된다.
GC가 실행되는 동안 애플리케이션이 멈추는(STW, Stop The World) 시간이 길어 성능 저하를 유발할 수 있다.
Stop The World(STW) 현상
모든 GC는 STW를 유발한다. 즉, GC가 실행되는 동안 애플리케이션의 모든 쓰레드가 멈춘다.
Minor GC는 비교적 빠르게 수행되지만, STW가 발생하는 동안 애플리케이션이 일시적으로 멈출 수 있다.
Major GC는 실행 시간이 길어 애플리케이션의 성능 저하를 유발할 가능성이 크다.
이를 최소화하기 위해 GC 튜닝 및 적절한 GC 알고리즘 선택이 중요
객체 생성 → Eden 영역에 할당
Eden 영역이 가득 차면 Minor GC 발생 → 살아남은 객체를 Survivor 영역으로 이동
Survivor 영역에서 여러 번 살아남은 객체는 Old Generation으로 이동
Old Generation이 가득 차면 Major GC(Full GC) 발생 → 불필요한 객체 제거