파이썬 가비지 컬렉션
목차 · 4개 항목
가비지 컬렉션(Garbage Collection)이란 더 이상 사용하지 않는 메모리를 정리하는 과정이다.
예시를 보자.
a = [1, 2, 3]
# 여기서 [1,2,3] 리스트 객체가 메모리에 생기고, a가 그 객체를 가리킨다.
# a -> [1,2,3]
a = None
## 이제 [1,2,3] 을 가리키는 변수가 없어진다.
def test():
x = [1, 2, 3]
y = {"name": "hong"}
## 이 경우에는 함수가 실행되는 동안에는 x,y 가 살아있다.
## 함수가 끝나면 x,y 라는 이름은 사라지고 [1,2,3], {"name": "hong"} 을 가리키는 변수가 없어진다.
아무도 안 가리키는 이런 객체들을 가비지라고 부른다.
쓰레기를 치우는 과정이 곧 가비지 컬렉션이다.
파이썬은 이걸 대부분 자동으로 해준다. (Reference Counting + GC)
그래서 우리는 보통 메모리 해체를 직접 하지 않는다.
파이썬이 가비지 컬렉션을 하는 방식은 두 단계로 나눠서 진행한다.
Reference Counting
Reference Counting이란? 이 객체를 몇명이 가리키고 있는지 세는 방식을 의미한다.
a = [1, 2, 3]
b = a
# a ─┐
# ├──> [1, 2, 3]
# b ─┘
# Reference Count = 2
a = None
# b ──> [1, 2, 3]
# Reference Count = 1
b = None
# [1, 2, 3]
# Reference Count = 0
Reference Counting가 0이 되면 즉시 메모리에서 제거
GC
Reference Counting만으로 치울 수 없는 객체를 찾아서 메모리에서 제거한다.
대표적인 경우가 순환 참조(cyclic reference)다.
a = []
b = []
a.append(b)
b.append(a)
# a ───> list A ───> list B
# ↑ │
# └──────────┘
a = None
b = None
# 이 경우 변수 a,b는 사라지지만, 리스트 A와 리스트 B는 서로를 가리키고 있다.
변수는 없어서 우리가 접근을 할 수 없는 상황이자 Reference Count는 0이 아니다.
마무리
파이썬에서 가비지 컬렉션은(안 쓰는 메모리 정리) 자동으로 관리해주기에 직접 관리할 필요가 없다.
내가 계속 참조하고 있는 객체는 못지운다.
순환 참조는 늦게 지워질 수 있다.
파일, 연결, 네트워크 연결 같은 자원은 GC에 맡기면 안된다.