python GC(Garbage Collector)
python GC(Garbage Collector)
이 글은 Tistory에서 이전된 포스팅입니다. 원본은 여기에서 확인할 수 있습니다.
python Garbage Collector
기본적으로 Reference Counting으로 해제하면서 Generational Garbage Collection이 세대별 임계점마다 동작하는 듯 하다.
Reference Counting
참조하는 카운트가 0이 되면 garbage를 정리한다.
Generational Garbage Collection
순환 참조의 경우 카운트가 0이 될 수 없는 문제를 해결할 수 있는 GC이다.
세대와 임계점이라는 개념이 있다.
1
2
3
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 주기를 짧게한다면 더 적은 메모리를 사용할 수 있다.
+ α
1
2
3
4
5
6
7
8
9
10
11
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)
1
2
3
4
5
6
7
8
9
(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
처음 생성한 객체는 자동 소멸되지 않는다..? 그리고 마지막은 소멸자가 두 번 동작했다. (이유는 아직 모르겠다.)
1
2
3
4
5
6
7
8
9
(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
이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.