python의 메모리 관리에 궁금증이 생겨 어떤 방식으로 진행하는지 알아보았습니다.
기본적으로 레퍼런스 카운트를 통한 참조 객체의 개수 체크와 가비지 콜렉터의 종합을 통해 관리한다고 보았는데,
순환참조라는 문제점으로 인해 메모리 누수가 발생할 수 있고 이를 확인하기 위해 가비지 콜렉터를 사용한다고 합니다.
예를 들어,
a = C()
b = C()
a.x = b
b.x = a 인 상황에서
del(a)
del(b) 를 하게 되면 a는 b가 삭제된 후에 삭제됩니다. (b 삭제이후 garbage collector가 호출될때)
가비지 콜렉터는 자바와 유사한 방식으로 구성되어 있는데 generation(세대)과 threshol (임계값)을 통해 가비지 콜렉션 주기와 객체를 관리합니다.
세대는 0,1,2로 구성되어 있으며 최근일수록 0에 가깝게, 오래 될 수록 2에 가깝게 존재하고 각 객체는 하나의 세대에만 존재합니다. 가비지 콜렉터는 0세대에 가까울수록 더 콜렉팅을 많이 하도록 설계되어 있습니다.
(threshold를 통한 주기설정이 되어있으며 각 세대가 객체를 할당한 횟수가 n을 초과하면 콜레팅을 수행하는 형식입니다.)
더 자세한 설명은 아래를 참조하면 확인할 수 있습니다.
참조:
'Python' 카테고리의 다른 글
Python 개발하며 실수할 수 있는 것 몇가지 (0) | 2022.07.27 |
---|---|
파이썬으로 클린 아키텍쳐 적용하기 (0) | 2022.07.26 |
python 리스트를 딕셔너리로 한줄에 바꾸는 방법. (0) | 2021.12.28 |
python range()와 xrange() (메모리 효율성) (0) | 2021.06.20 |
제너레이터, yield (이터레이터와 제너레이터) (0) | 2021.06.19 |