본문 바로가기
Java

[Java] Garbage Collector에 대해 알아보자

by 세류오 2026. 1. 4.

1. GC란 무엇인가?

GC는 더 이상 사용하지 않는 객체를 찾아서 메모리(Heap)에서 자동으로 지워주는 JVM의 청소부이다.

 

[왜 GC가 필요한가?]

원래 C/C++같은 언어는 개발자가 직접 "free()"를 사용하여 메모리를 직접 반납해야 했지다.

하지만 Java는 반납하는 작업을 GC가 알아서 하도록 만들어 편의성을 높혔다. 

 

[GC가 메모리를 반납하는 기준은 무었인가?]

그렇다면 GC가 자동으로 메모리를 반납하는 기준은 무엇인가?

그것은 바로 "이 객체에 도달할 수(reachable) 있나?"이다

도달할 수 있다는 의미는 이 객체가 참조되어 있는지를 확인하는 것을 의미한다

GC는 아래 같은 GC roots에서 출발해 그래프를 탐색한다.

- 실행 중인 스레드의 Stack에 잡힌 참조

- static필드 참조

- JNI 참조 등

[GC Root] → A → B → C   (살아있음)
[GC Root] → D                   (살아있음)
E → F (어디에서도 못 감) (죽음 = GC 대상)

위와같이 참조된 것들을 찾아나가며 어디서도 참조되지 못한 것은 Garbage로 취급한다.

2. Java에서 Heap메모리를 어떻게 관리되는가?

Java에서 GC는 다음과 같은 가정을 한다

- 대부분의 객체는 금방 죽는다.(메서드 안에서 잠깐 사용하고 버린다)

그래서 Heap메모리를 세대별로 나눠서 관리한다

- Young Generation(젊은 세대)

  - 새로 만든 객체의 모임

  - Eden

  - Survivor(S0, S1)

- Old Generation(늙은 세대)

  - 오래 살아남은 객체가 Old Generation으로 올라간다

[자바의 메모리 영역]

 

[Young Generation의 흐름]

Young Generation은 GC가 가장 자주 일어나는 곳이며 아래와 같은 순서로 메모리를 관리한다.

- 객체 생성

  - 객체는 보통 Eden에 생성된다.

- Eden이 가득 차면 Minor GC를 방생

  - Eden에 살아있는 객체만을 선책해서 Survivor로 복사한다.

  - 죽은 객체는 버린다(Eden을 비운다)

- 몇 번 살아남으면 Old로 승격

  - Survivor에서 일정 횟수 이상 살아남은 객체는 Old로 승격하여 이동된다.

[Old Generation의 흐름]

Old Generation은 오래 살아남은 객체가 많아 정리가 어렵고 크기도 크다

- 마킹(Marking): 살아있는 객체를 표시

- 정리(Sweep) 또는 압축(Compact): Old중 죽은 객체를 제거, 단편화를 해결

 

3. 대표알고리즘은 무엇인가?

대표적인 알고리즘으로는 Mark & Sweep / Mark & Compact가 있다

3-1 Mark & Sweep

- Mark: 루트에서 도달가능한 객체 체크(참조가되어있는 객체를 확인한다는 의미)

- Sweep: 체크 안 된 객체의 메모리를 해제(참조가 없는 객체를 의미)

3-2 Mark-Compact

- Mark: 루트에서 도달 가능한 객체 체크

- Compact: 살아있는 객체들을 한쪽으로 몰아서 메모리상 빈 공간을 크게 확보(메모리 정리)

4. Java의 GC가 빠르게 동작하는 이유는 무엇인가?

Java서버에서 객체는 "대부분 금방 죽는다"는 통계적 사실이 있다. 한마디로 대부분의 객체는 생성되고 얼마 있지 않아 쓸모 없어진다.

그래서 Heap을 세대별로 나눠서 관리하는데 그게 바로 Young Generation(새로 만든 객체들), Old Generation(오래 살아남은 객체들)이다.

4-1 Minor GC(주로 Young을 청소)

- Young 영역에서 빠르게 청소

- 보통 자주일어나지만 속도는 빠르다

- Eden이 가득차면 Minor GC를 실행

  - 살아남은 객체는 survivor로 이동

    - 이후에도 여러번 살아남는다면 Old로 승격한다.

4-2 Major / Full GC(Old까지 크게 청소)

- Old영역까지 정리한다.

- 크게 청소하는 만큼 르릴 수 있고 Stop-the world시간이 길어질 수 있다

4. Stop-the-world란?

- GC를 시작할 때 모든 애플리케이션의 스레드를 일시 정지 시키는 것이다.

- GC시작 >> 모든 스레드 멈춤 >> GC작업 실행 >> 멈춤 스레드 다시 시작

4-1 왜 멈춰야 할까?

- GC가 객체를 정리하는 동안 다른 누군가가 그 객체를 바꾸면 어떻게 될까? 만약 그런일이 일어난다면 객체의 무결성이 깨지고 데이터 손상이 발생하게 될 것이다.

- 그래서 정리를 안전하게 하기 위해 모든 스레드를 멈추는 것이다.