본문 바로가기
공부/Java

Garvage Collection이 뭔데? 어떻게 작동하는 건데?

by 아찌방 2025. 5. 7.

1. 🧩 GC(Garbage Collection)란?

Garbage Collection(가비지 컬렉션)은 Java Virtual Machine(JVM)이 더 이상 참조되지 않는 객체를 자동으로 메모리에서 제거하는 기능

 

즉, 프로그래머가 직접 free()delete를 호출하지 않아도, JVM이 사용하지 않는 객체를 탐지하고 메모리 회수를 자동으로 처리 함.

 

2. 💡 왜 GC가 필요한가?

  1. 메모리 누수 방지: 참조가 끊긴 객체를 제거하지 않으면 메모리가 낭비 됨.
  2. 안정성: 수동 메모리 관리(C/C++)와 달리, 잘못된 해제 오류(null pointer, double free 등)를 피할 수 있음.
  3. 생산성: 개발자가 메모리 관리를 걱정하지 않고 비즈니스 로직에 집중할 수 있음.

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 알고리즘을 기반으로 동작함.

  1. Mark: GC 루트(GC Root)에서 시작하여, 참조 가능한 객체를 "도달 가능한 객체"로 표시함
  2. 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 정책을 선택하는 것이 중요

 

 

 

 

 

 

 

 

 

728x90