1. 🧩 GC(Garbage Collection)란?
Garbage Collection(가비지 컬렉션)은 Java Virtual Machine(JVM)이 더 이상 참조되지 않는 객체를 자동으로 메모리에서 제거하는 기능
즉, 프로그래머가 직접 free()나 delete를 호출하지 않아도, JVM이 사용하지 않는 객체를 탐지하고 메모리 회수를 자동으로 처리 함.
2. 💡 왜 GC가 필요한가?
- 메모리 누수 방지: 참조가 끊긴 객체를 제거하지 않으면 메모리가 낭비 됨.
- 안정성: 수동 메모리 관리(C/C++)와 달리, 잘못된 해제 오류(null pointer, double free 등)를 피할 수 있음.
- 생산성: 개발자가 메모리 관리를 걱정하지 않고 비즈니스 로직에 집중할 수 있음.
3. 🔧 GC의 작동 과정
객체 생성
객체는 힙(Heap) 메모리에 생성
생성된 객체는 하나 이상의 참조 변수(reference)에 의해 참조
객체 사용
프로그램이 객체를 사용하면서 참조를 유지하거나 새로운 객체를 생성
객체 참조 해제
더 이상 필요하지 않은 객체에 대한 참조가 제거되면, 해당 객체는 "가비지(Garbage, 쓰레기)"가 됨
GC 수행 트리거
JVM은 메모리가 부족하거나 일정 시간 간격 또는 특정 조건에 따라 GC를 수행.
Reachability 분석
GC는 루트(root set) 객체(예: static 변수, 메서드 스택의 지역 변수 등)에서 출발해 도달 가능한 객체를 탐색.
도달할 수 없는(unreachable) 객체는 가비지로 간주.
메모리 회수
가비지로 분류된 객체의 메모리를 해제.
일부 GC는 객체가 적재된 힙 공간을 정리(compaction)해 단편화를 방지.
4. 🔧 GC의 작동 원리
자바에서의 GC는 Heap 메모리를 관리하며, 주요 동작 흐름은 다음과 같음.
🔹 4.1. 객체 생명 주기
자바의 힙 메모리는 다음과 같이 세 가지 영역으로 나뉨.
영역 | 설명 |
Young 영역 | 새로 생성된 객체가 저장됨. (대부분의 객체는 이 영역에서 생성 후 빠르게 사라짐.) GC가 자주 발생하며 속도가 빠름 Young Gen의 GC를 Minor GC라 부름 |
Old 영역 | Young Gen을 지나 일정 시간 이상 생존한 객체가 위치 GC가 적게 발생하지만 시간 소요가 큼 이 영역의 GC를 Major GC (또는 Full GC)라고 부름 |
Metaspace | 클래스 메타데이터가 저장됨 (PermGen 대체, Java 8부터 도입) |
🔹 4.2. Mark and Sweep 알고리즘
가비지 컬렉터는 보통 Mark and Sweep 알고리즘을 기반으로 동작함.
- Mark: GC 루트(GC Root)에서 시작하여, 참조 가능한 객체를 "도달 가능한 객체"로 표시함
- Sweep: 표시되지 않은 객체(즉, 참조되지 않은 객체)를 메모리에서 제거함
🔍 개인적 추론 : 실제 GC는 단순한 Mark & Sweep 외에도 compacting(조각 모음)이나 copying(복사 기반) 방식을 결합하여, 힙의 단편화를 줄이고 할당 속도를 높이는 방식을 사용하는 듯
🔹 4.3. Minor GC vs Major GC
종류 | 대상 영역 | 특징 |
Minor GC | Young 영역 | 짧고 빈번하게 일어남. 일반적으로 속도 빠름 |
Major GC | Old 영역 | 상대적으로 느림. 애플리케이션 일시 중단 가능 |
5. 🧠 GC Root란?
GC는 GC Root부터 참조 가능한 객체만을 "살아있는 객체"로 간주합니다. GC Root에는 다음이 포함됩니다:
- 스택(Local Variables)
- 메서드의 파라미터
- 클래스(static 변수)
- JNI에서 참조하는 객체
6. ⚠️ GC 관련 주의점
- OutOfMemoryError: GC가 메모리를 회수하지 못하면 예외 발생
GC가 자동으로 메모리를 해제하지만, 객체 참조를 유지하고 있으면 제거되지 않음 => 메모리 누수(leak) 발생 가능 - Stop-The-World(STW): GC 수행 중 JVM이 전체 애플리케이션을 멈추는 현상 발생 가능
(특히 Major GC의 경우 긴 STW를 유발할 수 있음) - GC 튜닝: -Xms, -Xmx, -XX 옵션 등으로 힙 크기 및 GC 정책 조절 필요
🔍 개인적 추론 : GC의 중단 시간은 사용자의 체감 성능에 직접적인 영향을 줍니다.
예를 들어, 실시간 처리 시스템이나 게임에서는 긴 GC 중단이 사용자 경험을 저해할 수 있으므로, CMS, G1, ZGC와 같은 적합한 GC 정책을 선택하는 것이 중요
'공부 > Java' 카테고리의 다른 글
[JAVA] 상속 - 다형성, 캐스팅, instanceof (1) | 2025.05.23 |
---|---|
[JAVA] 객체 - 선언, 생성, 대입 (1) | 2025.05.22 |
자바의 Boxing과 Unboxing: 오토박싱과 언박싱 제대로 이해하기 (0) | 2025.05.06 |