이 글 공유하기

이메일FacebookRedditWhatsApp

파이썬 가비지 컬렉션

#python#dev
목차 · 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에 맡기면 안된다.

참고

  1. Python 공식 문서: gc — Garbage Collector interface