변수의 기록

(운영체제) JAVA Garbage Collection: Mark and Sweep 본문

CS지식/운영체제 (Operating System)

(운영체제) JAVA Garbage Collection: Mark and Sweep

불광동 물주먹 2025. 6. 13. 00:44

Garbage Collection: Mark and Sweep

**Garbage Collection(GC)**은 자바에서 자동으로 메모리를 관리하는 핵심 기능이다.
사용되지 않는 객체를 자동으로 탐지하고 제거하여 메모리 누수를 방지하고,
개발자가 명시적으로 free()나 delete를 호출할 필요 없이 안정적인 메모리 관리가 가능하다.


왜 GC가 필요한가?

자바에서 객체를 생성하면 JVM의 힙 메모리에 저장된다.
하지만 어떤 객체가 더 이상 사용되지 않음에도 메모리에 남아 있다면,
사용 불가능한 메모리가 점점 쌓여 시스템 전체의 성능을 떨어뜨릴 수 있다.

GC는 이러한 "사용되지 않는 메모리"를 자동으로 정리해주는 시스템이다.


GC의 기본 방식 1: Reference Counting (참조 카운팅)

객체가 몇 개의 참조를 받고 있는지 수를 세어,
참조 수가 0이 되면 제거하는 방식.

A → B → A // 서로 참조하면 count가 0이 되지 않음 (순환 참조 문제 발생)
  • 장점: 간단하고 빠르다
  • 단점: 순환 참조 문제 해결 불가

GC의 실제 방식: Mark and Sweep (JVM 기본 방식)

자바의 GC는 Reference Counting의 한계를 극복Mark and Sweep 알고리즘을 사용한다.

1. Mark 단계

  • GC Root (예: 스택, static 변수 등)에서 시작하여,
    참조를 따라가며 사용 중인 객체들을 탐색하고 mark 표시를 붙인다.

2. Sweep 단계

  • Mark되지 않은 객체는 더 이상 접근할 수 없는 객체로 판단하고 메모리에서 제거(sweep)한다.
A → B → A // 서로 참조하면 count가 0이 되지 않음 (순환 참조 문제 발생)

장점

  • 순환 참조도 제거 가능 (mark되지 않으면 모두 제거됨)
  • 객체 생존 여부 판단이 정확함

Stop-the-World란?

GC가 동작하는 동안 모든 애플리케이션 스레드가 멈추는 현상이다.
즉, Mark and Sweep이 실행되는 동안 프로그램 로직은 일시 중단된다.

  • GC가 오래 걸릴수록 성능 저하, 응답 지연이 생김
  • 그래서 최신 GC는 Stop-the-world 시간을 줄이기 위한 다양한 전략 사용

JVM의 힙 구조와 GC 세대(Generation)

자바는 객체 생명 주기에 따라 메모리를 나누어 관리한다. 대표적인 구조는 다음과 같다:

 

영역 설명
Young Generation 새로 생성된 객체 저장, 대부분 여기서 GC 발생 (Minor GC)
Old Generation 오래 살아남은 객체 저장, Full GC 대상 (Major GC)
Eden, Survivor Young 내부에서 객체가 이동하며 생존 여부 판별
 

GC 종류 예시 (HotSpot JVM 기준)


GC 이름 특징
Serial GC 단일 스레드, 작은 애플리케이션에 적합
Parallel GC 다중 스레드 사용 (기본 설정)
CMS GC Stop-the-world 시간 줄임, 점점 Deprecated
G1 GC Full GC 정리도 병렬로 나눠 처리
ZGC, Shenandoah 최신 GC, 대용량 메모리에서 짧은 지연 시간
 

DTO나 Bean은 언제 GC 되는가?

  • Spring Bean 객체들은 ApplicationContext가 참조하고 있어서,
    애플리케이션 종료 전까지 GC 대상이 되지 않는다.
  • 반면, DTO, 지역 변수 객체 등은 일시적으로 생성되며,
    더 이상 참조되지 않으면 GC가 수거할 수 있다.