자바(Java), Go, 파이썬(Python) GC, 핵심 원리와 성능 비교!
가비지 컬렉션(Garbage Collection)의 기본 원리를 소개하고, 1960년대 McCarthy의 Mark-and-Sweep 알고리즘을 조명함
Wilson의 1992년 논문을 기반으로 현대적 GC 기술의 분류 체계(Taxonomy)를 제시하고, 주요 알고리즘을 설명함
자바(Java)의 G1GC, ZGC, Go의 동시성 GC, 파이썬(Python)의 하이브리드 방식 등 언어별 GC 구현 방식을 비교 분석함
성능 최적화(Performance Optimization)를 위한 제너레이션 가설(Generational Hypothesis)과 트라이컬러 마킹(Tricolor Marking) 등 핵심 개념을 설명함
GC의 기본 원리: Mark-and-Sweep 알고리즘
본문에서는 가비지 컬렉션(Garbage Collection)의 기원과 Mark-and-Sweep 알고리즘의 기본 원리를 설명한다. McCarthy의 1960년 논문을 통해 Lisp에서 처음 소개된 Mark-and-Sweep은 도달 가능성(Reachability)을 기반으로 메모리를 관리한다. 프로그램이 사용하는 객체를 식별하고, 도달할 수 없는 객체를 가비지로 간주하여 회수하는 방식이다. 초기에는 프로그램 전체를 멈추는 Stop-the-world 방식이었으나, 현대적 GC는 이 문제를 해결하기 위해 다양한 기술을 도입했다.
Wilson의 분류 체계와 현대적 GC
Wilson의 1992년 논문은 GC 연구를 체계화하여 현대적 GC 기술의 기반을 마련했다. Mark-and-Sweep, Copying, Reference Counting 등 세 가지 기본 알고리즘을 제시하고, 제너레이션 가설(Generational Hypothesis)과 트라이컬러 마킹(Tricolor Marking)과 같은 핵심 개념을 소개한다. 특히, 트라이컬러 마킹은 동시성 GC 구현의 핵심으로, 애플리케이션과 GC가 동시에 실행될 수 있도록 지원한다. 이러한 기술들은 현대 GC의 성능 향상에 크게 기여했다.
자바(Java)의 G1GC와 ZGC: 성능 비교
자바(Java)의 G1GC는 제너레이션, 리전 기반의 컬렉터로, 젊은 객체와 오래된 객체를 다르게 처리한다. G1GC는 혼합 컬렉션(Mixed Collection)을 통해 가비지 밀도가 높은 Old Region을 우선적으로 수집하여 Pause Time을 줄인다. 반면, ZGC는 Colored Pointer와 Load Barrier를 활용하여 거의 모든 작업을 동시적으로 처리하여, Sub-millisecond Pause Time을 보장한다. ZGC는 대용량 힙(Heap)에서 특히 강점을 보이며, Generational ZGC를 통해 성능을 더욱 향상시켰다.
Go의 동시성 GC와 파이썬(Python)의 하이브리드 방식
Go의 GC는 비제너레이션, 비압축, 동시성을 특징으로 하며, Pause Time 최소화에 중점을 둔다. 트라이컬러 마킹(Tricolor Marking)을 사용하여 애플리케이션과 GC를 동시에 실행하며, Write Barrier를 통해 트라이컬러 불변성(Tricolor Invariant)을 유지한다. 파이썬(Python)은 Reference Counting을 기본으로 하고, Cycle Detection을 위한 Tracing Collector를 추가한 하이브리드 방식을 사용한다. Reference Counting의 즉각적인 메모리 해제와 Cycle Detection의 순환 참조 문제를 해결하는 조합이다.
GC 튜닝(Tuning)과 성능 최적화
Go의 GOGC, 자바(Java)의 -XX:MaxGCPauseMillis와 같은 튜닝 파라미터를 통해 GC의 동작을 제어할 수 있다. GOGC는 GC 트리거 시점을 조절하여 메모리 사용량과 CPU 사용량 간의 균형을 맞추도록 돕는다. 자바(Java)의 G1GC는 Pause Time을 목표 값 내로 유지하기 위해 Region Count, Collection Set Size, Timing을 조절한다. ZGC는 Load Barrier를 통해 동시적 메모리 재할당(Concurrent Relocation)을 지원하여 Pause Time을 최소화한다.