가비지 컬렉션(Garbage Collection) 이해하기
이번 포스트에서는 프로그래머가 직접 메모리를 해제하지 않아도 알아서 관리되는 놀라운 기법인 가비지 컬렉션(Garbage Collection)에 대해 알아보겠습니다. 특히, 가비지 컬렉션이 어떻게 동작하는지, 그리고 어떤 트레이드 오프가 존재하는지 살펴봅니다.
가비지 컬렉션(Garbage Collection)이란?
가비지 컬렉션은 더 이상 사용되지 않는 메모리(가비지)를 자동으로 탐지하고 해제하는 기술입니다. 덕분에 프로그래머는 free()를 호출하지 않아도 되죠. 대표적으로 Java, Python, C# 같은 언어들이 가비지 컬렉션을 내장하고 있습니다.
가비지 컬렉션의 필요성
- 프로그래머의 부담 감소 (메모리 해제 실수 예방)
- 메모리 누수(memory leak)와 사용 후 해제(dangling pointer) 버그 방지
- 코드 작성에 대한 생산성 향상
하지만 여기에는 대가도 존재하는데요. 가비지 컬렉션을 사용하게 되면 성능 오버헤드나 예측 불가능한 실행 지연이 생길 수 있습니다.
가비지 컬렉션의 기본 원리
- 도달성(Reachability) 분석: 프로그램에서 접근 가능한 객체만 살아남는다
- Mark-and-Sweep: 접근 가능한 살아 있는 객체(블록)를 마킹하고, 도달할 수 없는 객체를 쓸어내듯 제거한다
- Stop-the-world: 가비지 컬렉션이 동작하는 동안 프로그램 실행을 일시 중단하는 경우가 있다
Mark-and-Sweep 알고리즘 흐름
- Mark Phase: 루트(root) 객체(예: 스택 변수)에서 시작해 접근 가능한 객체들을 모두 표시(mark)한다.
- Sweep Phase: 표시가 되어 있지 않은 객체들을 모두 해제(free)한다.
이 방식은 가장 기본적이고 직관적이며, 많은 가비지 컬렉터들이 이를 변형하여 사용합니다.
가비지 컬렉션의 단점
- 예측 불가능한 일시 중단 (stop-the-world) 가능성
- Garbage Collection 동작 시 프로그램 전체 실행을 멈추고 메모리를 청소해야 할 수 있다
- 이는 응답성이 중요한 시스템(게임, 실시간 시스템 등)에서 심각한 문제가 될 수 있음
- 추가적인 메모리 오버헤드 필요
- mark bit 저장 공간, 가비지 수거 작업을 위한 임시 작업 공간 할당 등
- 완벽한 수거가 불가능할 수 있음 (C언어/보수적 GC의 한계)
- 보수적 가비지 컬렉션(Conservative GC)의 경우 포인터인지 확실하지 않으면 살아있다고 가정하기 때문에, 실제 죽은 객체도 살아있다고 오해할 수 있다
- 특히 C언어에는 런타임 메모리 상의 값에 타입 정보가 없으므로 포인터와 일반 데이터와 구분할 수 없음
- 예) 가짜 포인터(일반 정수 값이지만 유효한 포인터 범위 안에 있어 포인터로 착각하는 것)로 인해 가비지 미수거 발생
C/C++에서의 가비지 컬렉션
C/C++은 기본적으로 가비지 컬렉션을 지원하지 않습니다. 하지만 Conservative Garbage Collector 라이브러리를 통해 비슷한 기능을 구현할 수 있는데요.
다만 이 경우 포인터처럼 보이는 값도 보수적으로 취급해야 하므로, 정확성이 떨어질 수 있습니다.
마치면서
이번 글에서는 가비지 컬렉션의 기본 개념, 동작 원리, 그리고 장단점을 살펴보았습니다. 메모리를 자동으로 관리하는 것은 개발을 훨씬 쉽게 해주지만, 성능이나 제어 측면에서는 여전히 trade-off가 존재하지요.
다음 포스트에서는 C 프로그램에서 흔히 발생하는 메모리 관련 버그를 다루고, 9장 전체를 깔끔하게 요약하면서 마무리해보려고 합니다. 감사합니다.
'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글
[CSAPP 6장 완전 정복] 6.1~6.2 저장장치 기술과 지역성(Locality) 개념 이해하기 (0) | 2025.04.28 |
---|---|
[CSAPP 9장 완전 정복] 9.11~9.12 C 프로그램에서 자주 발생하는 메모리 버그와 9장 전체 요약 (0) | 2025.04.26 |
[CSAPP 9장 완전 정복] 9.9(Part 12) 최종 정리: 간단한 동적 메모리 할당기 설계 방향 (0) | 2025.04.26 |
[CSAPP 9장 완전 정복] 9.9(Part 11) 메모리 활용률(Peak Utilization) 측정과 평가 지표 (0) | 2025.04.26 |
[CSAPP 9장 완전 정복] 9.9(Part 10) 할당기 설계 시 고려해야 할 제약과 목표 (0) | 2025.04.26 |