Topic (오늘의 주제)
Java Garbage Collection (GC)
Why (왜 사용하는가? 왜 중요한가?)
- 실무: C/C++처럼 개발자가 메모리를 직접 해제(free)할 필요가 없어 생산성이 높고, 메모리 누수(Memory Leak)로 인한 치명적인 오류를 막아줍니다.
- 구조적 의미: '대부분의 객체는 금방 불필요해진다(Weak Generational Hypothesis)'는 가설을 바탕으로 메모리 영역을 효율적으로 나누어 관리합니다.
- 면접 의도: 서비스의 성능 저하(랙) 원인이 될 수 있는 Stop-the-World 현상을 이해하고 있는지, 상황에 맞는 GC 튜닝이나 트러블슈팅이 가능한지 확인합니다.
Core Concept (핵심 개념 정리)
| 요소 | 내용 |
| 개념 정의 | Heap 메모리 영역에서 동적으로 할당했던 객체 중, 더 이상 참조되지 않는(Unreachable) 객체를 탐지하여 자동으로 제거하는 기법. |
| 동작 원리 | Mark and Sweep 1. Mark: 사용 중인 객체(Reachable)를 식별 2. Sweep: 식별되지 않은 객체들을 메모리에서 제거 |
| 구조 (Heap) | Young Gen: 생명주기가 짧은 객체들이 존재 (Eden, Survivor 0/1 영역) Old Gen: Young 영역에서 오랫동안 살아남은 객체들이 이동됨 |
| 실행 과정 | 1. Minor GC: Young 영역이 꽉 차면 발생. 속도가 빠름. 2. Major GC (Full GC): Old 영역이 꽉 차면 발생. 속도가 느리고 성능에 영향을 줌. |
| 주의점 | Stop-the-World (STW): GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 현상. 모든 스레드가 정지하므로 성능 이슈의 주범이 됨. |
Interview Answer Version (면접 답변식 요약)
"Garbage Collection은 자바의 힙 메모리에서 사용되지 않는 객체를 자동으로 제거해주는 프로세스입니다.
GC는 객체의 생존 기간에 따라 힙 영역을 Young 영역과 Old 영역으로 나누어 관리합니다. Young 영역에서 발생하는 GC를 Minor GC, Old 영역까지 꽉 차서 발생하는 GC를 Major GC라고 합니다.
특히 GC가 실행될 때 애플리케이션이 멈추는 Stop-the-World 현상이 발생하는데, 이를 최소화하는 것이 성능 튜닝의 핵심입니다."
Practical Tip (사용시 주의할 점 or 활용 예)
1. System.gc() 절대 사용 금지
코드 내에서 System.gc()를 직접 호출하는 것은 매우 위험합니다. 이는 시스템 전체를 멈추게 하는(Stop-the-world) Full GC를 강제로 유발할 수 있어 실제 운영 중인 서버 성능에 치명적입니다.
2. G1GC (Garbage First GC)의 이해
과거에는 Serial, Parallel GC 등을 썼지만, 최근(Java 9 이상) 기본 GC는 G1GC입니다.
- G1GC는 전체 Heap을 일정한 크기의 Region으로 나누어 관리하며, 전체를 다 뒤지는 것이 아니라 가비지가 많은 Region부터 청소하여 STW 시간을 획기적으로 줄였습니다. 대용량 메모리 서비스에서 필수적입니다.
3. 메모리 누수 패턴 주의
GC가 있어도 메모리 누수는 발생합니다.
- Close 하지 않은 리소스: DB Connection, IO Stream 등.
- Static 변수의 무분별한 사용: Static은 GC 대상이 되지 않으므로 주의해야 합니다.
예상 꼬리 질문 정리
- Stop-the-World가 무엇이며, 왜 발생하나요?
- 답변 포인트: GC가 메모리를 정리하는 동안 객체의 메모리 주소가 바뀔 수 있기 때문에, 안전한 처리를 위해 애플리케이션 스레드를 모두 멈춰야 함을 설명.
- Minor GC와 Major GC(Full GC)의 차이점은?
- 답변 포인트: 대상 영역(Young vs Old), 발생 빈도(자주 vs 가끔), 속도(빠름 vs 느림/부하 큼) 비교.
- Java 버전별 Default GC 알고리즘을 아시나요?
- 답변 포인트: Java 8(Parallel GC) -> Java 9 이후(G1GC). 최신 트렌드인 ZGC 등에 대한 언급도 좋음.
'Archive > Daily Dev Q&A' 카테고리의 다른 글
| Daily Dev Q&A: 객체지향언어란? & 왜 JAVA가 객체지향언어인가? (0) | 2025.12.01 |
|---|---|
| Daily Dev Q&A: 자바의 예외 처리(Exception) 구조 (0) | 2025.11.28 |
| Daily Dev Q&A: 자바는 컴파일 언어? 인터프린터 언어? (0) | 2025.11.28 |
| Daily Dev Q&A: 자바의 메모리 구조 (0) | 2025.11.26 |
| Daily Dev Q&A: JVM (0) | 2025.11.24 |