Python 자동 가비지 컬렉션이란?
자동 가비지 컬렉션(Automatic Garbage Collection)은 Python의 핵심 기능 중 하나입니다. 가비지 컬렉터는 프로그램에서 더 이상 사용되지 않는 객체가 차지하고 있는 메모리를 회수하여, 개발자가 직접 메모리를 관리하는 부담을 덜어줍니다.
참조 카운팅(Reference Counting) 방식
Python은 참조 카운팅 방식을 기반으로 가비지 컬렉션을 수행합니다. Python 인터프리터는 각 객체가 다른 객체로부터 몇 번 참조되고 있는지 그 횟수를 지속적으로 추적합니다.
- 객체에 대한 참조가 추가되면 참조 카운트가 증가합니다.
- 참조가 제거되면 참조 카운트가 감소합니다.
- 참조 카운트가 0이 되면 해당 객체의 메모리는 즉시 회수됩니다.
이러한 과정은 일반적으로 자동으로 처리되지만, 프로그램의 특정 상황에서는 개발자가 의도적으로 가비지 컬렉션을 제어해야 할 필요가 있습니다. 이때 사용하는 것이 바로 gc 모듈입니다.
gc 모듈의 주요 함수
Python의 'gc' 모듈은 가비지 컬렉션을 직접 제어할 수 있는 인터페이스를 제공합니다. 주요 함수는 다음과 같습니다.
| enable() | 자동 가비지 컬렉션을 활성화합니다. |
| disable() | 자동 가비지 컬렉션을 비활성화합니다. |
| isenabled() | 자동 가비지 컬렉션이 활성화되어 있으면 True를 반환합니다. |
| collect() | 인수 없이 호출하면 전체 컬렉션(full collection)을 실행합니다. 선택적 정수 인수(0~2)를 지정하면 해당 세대(generation)만 수집합니다. 잘못된 세대 번호를 입력하면 ValueError가 발생합니다. 발견된 도달 불가능(unreachable) 객체의 수를 반환합니다. |
| set_threshold() | 가비지 컬렉션 임계값(컬렉션 빈도)을 설정합니다. |
| get_threshold() | 현재 설정된 컬렉션 임계값을 튜플(tuple) 형태로 반환합니다. |
| callbacks | 가비지 컬렉션이 수행되기 전후에 호출되는 콜백 함수 목록입니다. |
gc.collect() 활용 예시
import gc
# 수동으로 전체 가비지 컬렉션 실행
collected = gc.collect()
print(f"회수된 객체 수: {collected}")
# 특정 세대만 수집 (0, 1, 2)
gc.collect(0)세대별 가비지 컬렉션(Generational GC)
Python의 가비지 컬렉터는 세대별(generational) 방식으로 동작합니다. 객체는 생성 시점에 따라 0세대, 1세대, 2세대로 나뉘며, 새로 생성된 객체일수록 더 자주 검사 대상이 됩니다. 오래 살아남은 객체일수록 수집 빈도가 낮아져 성능이 최적화됩니다.
마무리
대부분의 경우 Python의 자동 가비지 컬렉션에 의존해도 충분하지만, 순환 참조(circular reference) 처리나 메모리 사용량이 중요한 애플리케이션에서는 gc 모듈을 활용한 수동 제어가 유용할 수 있습니다. 위에서 소개한 함수들을 적절히 조합하면 프로그램의 메모리 관리를 보다 세밀하게 최적화할 수 있습니다.