python Garbage Collector
기본적으로 Reference Counting으로 해제하면서 Generational Garbage Collection이 세대별 임계점마다 동작하는 듯 하다.
Reference Counting
참조하는 카운트가 0이 되면 garbage를 정리한다.
Generational Garbage Collection
순환 참조의 경우 카운트가 0이 될 수 없는 문제를 해결할 수 있는 GC이다.
세대와 임계점이라는 개념이 있다.
import gc
print(gc.get_threshold()) #(700, 10, 10)
튜플의 첫 번째부터 0세대, 1세대, 2세대를 나타낸다.
0세대 객체의 수가 700개(임계값)를 넘지 않으면, 순환 참조를 비롯한 garbage들은 메모리에 할당된 상태이다.
임계값을 넘으면 Generational GC가 동작하고 여기서 해제되지 않은 객체들은 다음 세대로 넘어간다.
1세대의 임계점은 700*10개, 2세대 임계점은 700*10*10개를 의미한다.
세대 기반 GC는 응용 프로그램을 완전히 중지하고 동작한다.
그래서 임계점은 변경할 수 있으며 다음과 같은 선택이 가능하다.
더 많은 메모리를 사용한다면 GC 주기를 길게 할 수 있고
GC 주기를 짧게한다면 더 적은 메모리를 사용할 수 있다.
+ α
class Test:
def __init__(self, i) -> None:
print(gc.get_count())
print(f"hi {i} id:{id(i)}")
def __del__(self):
print(f"bye {i} id:{id(i)}")
for i in range(3):
test = Test(i)
# del(test)
(237, 1, 1)
hi 0 id:140718906091280
(238, 1, 1)
hi 1 id:140718906091312
bye 1 id:140718906091312
(238, 1, 1)
hi 2 id:140718906091344
bye 2 id:140718906091344
bye 2 id:140718906091344
처음 생성한 객체는 자동 소멸되지 않는다..? 그리고 마지막은 소멸자가 두 번 동작했다. (이유는 아직 모르겠다.)
(237, 1, 1)
hi 0 id:140718906091280
bye 0 id:140718906091280
(237, 1, 1)
hi 1 id:140718906091312
bye 1 id:140718906091312
(237, 1, 1)
hi 2 id:140718906091344
bye 2 id:140718906091344
반복문 마다 del로 확실히 처리하면 의도한 결과가 나온다.
참고 자료
https://medium.com/dmsfordsm/garbage-collection-in-python-777916fd3189
Garbage Collection in Python
Python의 메모리 관리 기법을 알아보자.
medium.com
https://devbull.xyz/python-garbace-collection/
파이썬의 가비지 콜렉션에 대해서
파이썬의 쓰레기 수집, 즉 가비지 콜렉션(Garbage collection)은 두 가지 양상을 가지고 있습니다. * 레퍼런스 카운팅 * 세대기반 다만 주의해야 하는 점은 여기서 이야기하는 파이썬은 C 구현체(CPython)
devbull.xyz
'Language > Python' 카테고리의 다른 글
python) asyncio/코루틴, 동시성과 병렬성 (0) | 2023.12.13 |
---|