Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 객체는 언제 가비지 컬렉션 대상이 될까?

파이썬에서 객체나 변수는 해당 객체에 대한 모든 참조가 사라지는 순간 가비지 컬렉션(garbage collection) 대상이 됩니다. 참조가 사라지는 경우는 크게 두 가지입니다.

  • 객체를 참조하던 변수가 스코프(scope)를 벗어날 때
  • del x처럼 참조를 명시적으로 삭제할 때

다만, 객체가 실제로 메모리에서 회수되려면 프로그램 어디에서도 그 객체를 참조하는 곳이 더 이상 없어야 한다는 점에 유의해야 합니다.

참조 카운팅(Reference Counting) 방식

CPython은 참조 카운팅을 기본 메모리 관리 메커니즘으로 사용합니다. 각 객체는 자신을 참조하는 횟수(레퍼런스 카운트)를 기록하고 있으며, 이 값이 0이 되는 즉시 메모리에서 회수됩니다.

x = [1, 2, 3]   # 참조 카운트 = 1
y = x           # 참조 카운트 = 2
del x           # 참조 카운트 = 1
del y           # 참조 카운트 = 0 → 가비지 컬렉션 대상

순환 참조와 세대별 가비지 컬렉터

참조 카운팅만으로는 서로를 참조하는 순환 참조(circular reference) 구조를 처리할 수 없습니다. 이를 보완하기 위해 파이썬은 별도의 세대별(generational) 가비지 컬렉터를 함께 운영하며, 도달할 수 없는(unreachable) 순환 참조 객체들을 주기적으로 탐색하여 회수합니다. 표준 라이브러리의 gc 모듈을 사용하면 이 동작을 확인하거나 제어할 수 있습니다.

정리

요약하면, 파이썬 객체는 모든 참조가 스코프를 벗어나거나 삭제되어 참조 카운트가 0이 되는 시점에 가비지 컬렉션 대상이 됩니다. 반대로 프로그램의 다른 곳에서 여전히 객체를 참조하고 있다면, 해당 객체는 회수되지 않고 메모리에 계속 남아 있게 됩니다.