참조 링크
GC(Garbage Collector)
- C#, JS, Python 등의 언어에서는 GC를 기본적으로 제공
- GC는 메모리를 자동으로 관리해주는 과정임
Python의 Garbage Collection 구현
- CPython에서의 메모리 관리와 Garbage Collection은 두가지 측면이 있다.
- reference counting
- generational garbage collection
CPython의 reference counting
- CPython에서의 주요 GC mechanism은 reference counts 방식
- 기본 C형 객체를 반들 때마다, Python 유형(list, dict 또는 function)과 reference count가 생성된다.
- 매우 기본적으로 Python 객체의 reference count는 객체가 참조될 때마다 증가하고, 객체의 참조가 해제될 때 감소한다.
- 객체의 reference count가 0이 되면, 객체의 메모리 할당이 해제된다.
Python의 reference counting
- 참조 횟수를 증가시키는 방법은
- 변수에 객체 할당
- list에 추가하거나, class instance에서 attribute으로 추가하는 등의 data structure에 객체 추가
- 객체를 함수의 인수로 전달
import sys
a = 'hello'
b = [a]
sys.getrefcount(a)
>>>
3
Generational Garbage Collection
문제 제기
- 아래와 같이 객체 순환참조의 경우, reference counts가 0이 되지 않아, (객체는 더 이상 접근할 수 없지만) 메모리 할당이 해제되지 않는다. -> garbage가 된다.
a = []
a.append(a)
del a
sys.getrefcount(a)
>>>
1
Generational Garbage Collector
- GC는 메모리의 모든 객체를 추적한다.
- Generation 이란?
- 새로운 객체는, 1세대 Garbage Collector에서 life를 시작한다.
- Python이 이 세대에서 Garbage collection process를 실행하고 객체가 살아남으면, 두 번째 이전 새대로 올라간다.
- Python Garbage Collector은 총 3세대에며, 객체는 현재 세대의 Garbage Collection process에서 살아남을 때마다, 이전 세대로 이동한다.
- Threshold 개념
- 각 세대마다 garbage collector 모듈에는, threshold 값 개수의 개체가 있다.
- 객체 수가 해당 threshold를 초과하면, Garbage Collection이 Collection process를 trigger합니다.
- 해당 수집 프로세스에서 살아남은 객체는, 다음 세대로 옮겨집니다.
- 0세대에 가까울수록 (0~2세대 중) 더 자주 garbage colection을 하도록 설계되어 있는데, 이는 어린 객체가 오래된 객체보다 해제될 가능성이 훨씬 높다는 가설 떄문이다.
TODO...
weak reference & strong reference
- application이 object에 strong reference를 가지고 있는 경우.
- Garbage collector은 application에 의해 사용되고 있는 object를 수집할 수 없다. (application의 code는 해당 object에 도달할 수 있지만,)
- weak reference
- (application의 code가 해당 object에 도달할 수 있을 때) garbage collector 가 해당 객체를 수집할 수 있도록 함.
- weak reference는 "strong references 가 존재하지 않는 동안 object가 수집될 때까지의" 불확실한 시간 동안만 타당하다.
- 즉, 너가 weak reference를 사용할 때, application은 여전히 해당 object에 대해 strong reference를 획득할 수 있다.
- weak references는 많은 메모리를 사용하는 objects에서 유용하다. 그러나 만약 objects가 garbage collection에게 reclaimed되면 쉽게 제 생성될 수 있다.