- Heap 메모리에서 더 이상 사용되지 않는 객체를 자동으로 제거하는 프로세스.
- 어플리케이션의 메모리 관리를 자동화하여 메모리 누수를 방지하고 메모리 사용을 최적화 하는 중요한 역할.
Java 힙 메모리 구조(Heap Memory)
Java에서는 Heap 메모리를 관리하며, 이 메모리는 객체를 생성하는 데 사용되는 런타임 메모리 공간이다. Heap 메모리는 크게 Young Generation과 Old Generation으로 나뉜다. 각 영역은 객체 생성, 소멸 및 승격을 관리하는 방식이 다르다.
- Young Generaion(젊은 세대)
- 객체가 처음 생성될 때 대부분 Yound Generation에 할당됨
- Eden 영역에 객체가 할당되고, Eden이 꽉 차면 Minor GC가 발생하여 살아남은 객체는 Survivor 영역으로 이동
- 여러 번 Survivor 영역을 지나면 객체는 Old Generation으로 승격됨
- Old Generation(Old 또는 Tenured Generaion)
- Young Generation에서 승격된 객체들이 저장되는 공간.
- 이 영역이 가득 차면 Major GC 또는 Full GC가 실행됨.
- Old Generation은 상대적으로 크기가 크고, GC 발생 빈도가 적음.
- Metaspace(메타스페이스)
- 클래스 메타데이터가 저장되는 공간. (Java 8 이후, PermGen이 사라지고 Metaspace로 대체됨)
- 클래스 로딩 시 메타데이터를 여기에 저장하고, JVM이 동적으로 클래스를 관리해서 메모리 관리의 유연성과 효율성을 향상시킴.
GC 동작과정
GC는 객체를 자동으로 관리하는 중요한 기능이지만, 기본적으로 객체가 더 이상 사용되지 않을 때 메모리에서 제거되어야 한다. GC 동작과정은 크게 Minor GC와 Major GC로 나뉜다.
1) Minor GC (Young Generation GC)
- Young Generation에 있는 객체들이 더 이상 참조되지 않으면 Minor GC가 발생
- Eden 영역이 가득 차면, GC가 실행되고, Eden 영역에서 살아남은 객체들은 Survivor(S0, S1) 영역으로 이동
- S0, S1 영역은 서로 교환되며 살아남은 객체를 이동시킴
- Young Generation에서 객체가 계속 살아남으면, 객체는 Old Generation으로 Promotion(승격)되어 이동
Minor GC의 특징:
- 짧은 시간에 실행
- 빠른 처리가 가능하지만 전체 Heap 메모리를 처리하지 않음
2) Major GC (Old Generation GC)
- Old Generation에 할당된 객체들이 더 이상 참조되지 않으면, Major GC가 발생
- Old Generation의 객체를 전부 검사하고, 더 이상 사용되지 않는 객체들을 제거
- Major GC는 Young Generation에서 발생하는 GC보다 더 오래 걸리고, Stop-the-world 현상이 발생하여 애플리케이션이 멈추는 시간이 길어짐.
Major GC의 특징:
- 긴 시간이 걸릴 수 있으며, 애플리케이션의 일시 정지(Stop-the-world)가 발생함
- Full GC가 일어나면 전체 Heap을 검사하고 정리
3) Stop-the-World 이벤트
- Stop-the-World는 GC가 실행되는 동안 애플리케이션이 일시적으로 멈추는 현상
- 특히 Major GC와 Full GC에서 발생하며, 애플리케이션의 응답성을 낮출 수 있음.
- 이를 최소화하기 위해서는 Low Latency GC를 사용하거나, GC를 튜닝해야 함.
GC 동작흐름
- 객체 생성
- 객체가 생성되면 Young Generation의 Eden 영역에 할당됨.
- Minor GC 발생
- Eden 영역이 가득 차면, Minor GC가 발생하고, 살아남은 객체들은 Survivor 영역(S0/S1)으로 이동함.
- 객체 승격
- Survivor 영역에서 여러 번 살아남은 객체는 Old Generation으로 승격되어 이동됨.
- Major GC 발생
- Old Generation이 가득 차면, Major GC가 발생하고, Old Generation에서 사용되지 않는 객체들을 제거함.
- Full GC
- Major GC와 비슷하지만, Young Generation과 Old Generation을 동시에 정리하며, 메타스페이스도 청소됨.
- Full GC는 시간이 많이 걸리고 애플리케이션 성능에 영향을 미침.
주요 Java 버전별 GC 변화
Java 버전 | GC 주요 변화 | 설명 |
Java 8 | G1 GC 도입 | G1 GC가 도입되어 Low-latency와 예측 가능한 일시 정지 시간을 목표로 함. |
Java 9 | G1 GC 기본 GC로 설정 | G1 GC가 기본 GC로 설정되었으며, 성능 개선 및 튜닝 옵션 추가. |
Java 11 | ZGC와 Shenandoah GC 도입 | ZGC와 Shenandoah GC가 도입되어 저지연 성능을 제공함. |
Java 12 + | Shenandoah GC와 ZGC 성능 개선 및 기본화 | Shenandoah GC와 ZGC의 성능 향상 및 안정성 개선, GC 선택지가 확대됨. |
G1 GC(Java 8 도입)
- Low-latency를 목표로 하고, 예측 가능한 일시 정지 시간을 제공.
- Young Generation과 Old Generation을 부분적으로 병렬 처리.
- Stop-the-World 시간을 최소화하려고 노력.
- 대규모 애플리케이션에 적합하고 Java 9부터 기본 GC로 설정됨.
ZGC (Zero, Java 11 도입)
- 저지연 GC로, Stop-the-World 시간을 매우 짧게 유지.
- 대규모 시스템에서 메모리 관리가 필요한 경우 유용.
- Multi-threaded 방식으로 가비지 수집을 처리.
- Low-latency 환경에 적합, 실시간 애플리케이션에 좋음.
Shenandoah GC (Java 12 도입)
- 저지연 GC로 Stop-the-World 시간을 최소화.
- Young Generation과 Old Generation을 병렬 처리하면서도 일시 정지 시간이 짧음.
- ZGC와 유사하지만 성능 및 안정성에 대한 차이가 있음.
- 대규모 시스템과 실시간 시스템에 적합.
'백엔드 면접준비 > Java' 카테고리의 다른 글
8.JAR (1) | 2025.03.10 |
---|---|
7. 동기,비동기, 블로킹, 논블록킹 (1) | 2025.03.08 |
4. Java Annotation (0) | 2025.03.07 |
3. Java Collection Framework(JCF) (1) | 2025.02.03 |
2. Java 멀티쓰레드 환경(volatile, synchronized, atomic) (1) | 2025.02.02 |