개요
- 파이썬은 편리성과 강력함으로 많은 개발자에게 사랑받는 프로그래밍 언어입니다. 파이썬에서 편리함을 주는 기능들은 많이 있겠지만 자동적으로 진행되는 Garbage Collection(GC)도 하나의 큰 요소로 작용합니다.
- 파이썬의 가비지 컬렉션(GC) 시스템은 자동으로 메모리 관리를 수행함으로써, 개발자가 프로그램의 복잡성에 신경 쓰지 않고 더 중요한 알고리즘 구현과 최적화에 집중할 수 있도록 도와줍니다. 이는 특히 메모리 관리가 필수적인 큰 프로젝트나 서비스에서 더욱 큰 장점으로 작용합니다.
해당 글은 이전 글인 ”파이썬은 모든 것이 객체?”를 보고 오시면 이해가 더 쉽습니다.
파이썬의 가비지 컬렉션 방식
- 레퍼런스 카운팅(Reference Counting)
- 마크-앤-스윕(Mark-and-Sweep)
위와 같이 파이썬 가비지 컬렉션 방식은 두 가지의 방식이 있지만 파이썬에서는 주로 래퍼런스 카운팅이 쓰이고, 보조적으로 마크 앤 스윕을 쓰인다고 합니다. 따라서 이번 글에서는 주로 쓰이는 레퍼런스 카운팅에 대해서 작성해보도록 하겠습니다.
레퍼런스 카운팅이란?
레퍼런스 카운팅은 객체가 몇 개의 참조(reference)를 갖고 있는지를 추적하는 방법입니다. 파이썬 내부에서는 모든 객체에 대해 참조 수를 관리하며, 이 참조 수가 0이 되는 순간 그 객체는 메모리에서 자동으로 해제됩니다.
import sys
# 객체 생성
a = []
# 1. a의 reference 카운트 확인
print(sys.getrefcount(a))
# 실행 결과 : 2
# 2. a에 대한 추가 reference 생성
b = a
print(sys.getrefcount(a))
# 실행 결과 : 3
# 3. reference 하나 제거
del b
print(sys.getrefcount(a))
# 실행 결과 : 2
위의 코드에서 실행한 결과를 확인해보면 a라는 객체를 생성한 후에 참조 카운트를 확인해보면 2라는 결과값을 확인해 볼 수 있습니다.
- 결과값이 2인 이유는 a라는 본인에 대한 참조와 getrefcount 라는 함수가 인자로 받은 객체에 대한 참조로 참조 수를 계산하는 동안만 존재하며 함수가 반환될 때 감소합니다.
- 여기서는 기존의 참조 값 + b가 a를 참조하는 값을 포함하여 3이라는 숫자가 반환됩니다.
- 마지막으로 b의 참조를 해제하고 확인해보면 처음 결과값 처럼 2라는 결과를 볼 수 있습니다.
정리
파이썬의 메모리 관리 시스템은 주로 레퍼런스 카운팅 방식을 사용하여 객체의 수명을 관리합니다. 이 방식의 기본 원리는 각 객체마다 참조 카운트를 유지하고, 이 카운트가 0이 될 때 해당 객체를 메모리에서 해제하는 것입니다.
하지만, 레퍼런스 카운팅 방식의 가장 큰 문제점으로 순환 참조(circular reference)를 처리하지 못한다는 문제가 있습니다. 따라서 순환 참조와 이를 처리하는 방식에 대해서 다음 글에서 설명드리겠습니다.
참고
'Language > Python' 카테고리의 다른 글
[Python]GIL 너는 대체 머냐? (0) | 2024.04.15 |
---|---|
[Python]리스트의 메모리 할당 (0) | 2023.03.27 |
[Python]파이썬은 모든것이 객체? (0) | 2022.08.22 |
[Python] 함수 인자 전달 방식 - Call by assignment (0) | 2022.08.22 |