4차산업혁명의 일꾼/백엔드

가비지 컬렉터(Garbage Collector, GC) 특징

르무엘 2025. 6. 6. 12:37

Java에서 가비지 컬렉터(Garbage Collector, GC)는 프로그래머가 직접 메모리를 해제하지 않아도 되도록 더 이상 사용되지 않는 객체를 자동으로 탐지하고 제거하여 Heap 메모리를 회수하는 역할을 합니다. Java 가상 머신(JVM)의 중요한 메모리 관리 기능 중 하나이며, 객체 생명 주기와 메모리 구조를 기반으로 작동합니다.


---

🧠 기본 개념

Heap 메모리: Java에서 객체가 동적으로 생성되는 공간.

Reachable object: GC 루트(GC Root)에서부터 참조되는 객체.

Unreachable object: 더 이상 참조되지 않는 객체 → GC 대상.



---

🚦가비지 컬렉션의 기본 동작 과정

1. Mark (표시 단계)
GC는 "GC Root"에서 시작해 참조되고 있는 객체들을 찾아 도달 가능한(reachable) 객체로 표시합니다.


2. Sweep (제거 단계)
표시되지 않은, 즉 더 이상 참조되지 않는 객체들을 Heap에서 제거합니다.


3. Compact (정리 단계)
객체가 제거된 후 남은 객체들을 연속된 공간으로 이동시켜 메모리 단편화(fragmentation)를 줄입니다. 이 단계는 필요에 따라 실행됩니다.




---

🔍 GC Root란?

다음과 같은 요소들이 GC Root로 간주됩니다:

스레드의 지역 변수와 매개변수 (Stack 영역)

정적(static) 필드

JNI(Java Native Interface)에서 참조된 객체

메서드 영역에서 사용 중인 클래스


GC는 이 GC Root에서부터 참조 체인을 따라가서 도달 가능한 객체만 살립니다.


---

🚧 세대별 가비지 컬렉션 (Generational GC)

Java는 객체의 생명주기를 고려해 Heap을 여러 세대로 나누고, 세대별로 다른 방식의 GC를 수행합니다.

1. Young Generation (Young Gen)

대부분의 새 객체가 여기에 생성됨.

Minor GC가 자주 일어남.

Eden → Survivor 영역으로 객체 이동, 생존 횟수가 높으면 Old Gen으로 이동.



2. Old Generation (Tenured Generation)

오래 살아남은 객체가 위치함.

Major GC (또는 Full GC) 발생 시 더 느리지만 전체 Heap을 검사함.



3. (Optional) Metaspace

클래스 메타데이터가 저장되는 공간 (Java 8부터 PermGen 대체).





---

⚙️ GC 알고리즘의 종류 (대표적인 것들)

알고리즘 특징

Serial GC 단일 스레드, 소규모 애플리케이션에 적합
Parallel GC 다중 스레드 사용, Throughput 최적화
CMS (Concurrent Mark-Sweep) 멈춤 시간이 짧음, Old Gen을 병렬로 처리
G1 (Garbage-First) 큰 Heap에 적합, Pause time 예측 가능
ZGC / Shenandoah (최신) 매우 짧은 멈춤 시간, 매우 큰 Heap에 적합



---

🎯 예시 시나리오

public class Example {
    public static void main(String[] args) {
        Object a = new Object(); // GC Root에서 참조됨
        Object b = new Object(); // 참조되지 않음

        a = null; // 이제 a도 참조되지 않음 → GC 대상
    }
}

a와 b가 참조되지 않게 되면, 다음 GC가 실행될 때 이 객체들은 수집 대상이 됩니다.



---

📌 정리

Java의 GC는 자동 메모리 관리 시스템이다.

GC는 Reachability를 기준으로 사용되지 않는 객체를 탐지한다.

세대별 관리로 효율을 높이고, 다양한 알고리즘으로 상황에 맞게 튜닝 가능하다.

프로그래머는 명시적으로 객체를 해제할 필요가 없지만, 객체 참조를 잘 관리해야 메모리 누수를 피할 수 있습니다.




LIST