파이썬 메모리 관리 기법
기존 메모리 관리 문제점
C와 C++ 언어는 메모리 관리를 수동으로 해야하는데 이때 발생할 수 있는 문제점이 개발자가 개발하면 메모리 관리를 철저하게 하지 않으면 애플리케이션 성능이 엄청나게 떨어진다는 단점이 있음
- 필요없는 메모리를 비우지 않았을 때
- 사용중인 메모리 비우기
Python GC (Garbage Collector)
Python 에서 가비지 컬렉션은 아래 두가지 개념을 사용함
- 레퍼런스 카운팅 (Reference counting)
- 세대별 가비지 컬렉션 (Generational garbage collection)
CPython 에서의 Reference Counting
CPython에서의 주요 garbage collection mechanism 은 reference counts 방식이라는것
기본적으로 Python 객체의 reference count 는 객체가 참조될 때 마다 증가하고 객체의 참조가 해제될 때 감소함. reference count 가 0이되면 객체의 메모리 할당이 해제됨
근데 순환 참조의 경우에는 해당 방식으로 메모리 자원을 해제 할 수 없음 그래서 나온 개념이 Generational Garbage Collection 임
Generational Garbage Collection
파이썬은 메모리 관리를 위한 reference counting 이외에도 generational garbage collection(세대별 가비지 컬렉션) 방법을 사용함
a = []
a.append(a)
del a
a 의 참조 횟수는 1이지만, 레퍼런스 카운팅 방식으로는 메모리에서 해제 될 수 없음
> \>> a = Func_pr() # 0x01
> \>> b = Func_pr() # 0x02
> \>> a.x = b # 0x01의 x는 0x02를 가리킨다.
> \>> b.x = a # 0x02의 x는 0x01를 가리킨다.
# 0x01의 레퍼런스 카운트는 a와 b.x로 2다.
# 0x02의 레퍼런스 카운트는 b와 a.x로 2다.
> \>> del a # 0x01은 1로 감소한다. 0x02는 b와 0x01.x로 2다.
> \>> del b # 0x02는 1로 감소한다.
마지막 상태에서 0x01.x 와 0x02.x 가 서로를 참조하고 있어서 레퍼런스 카운트는 둘다 1이지만 0에 도달할 수 없는 garbage(쓰레기)가 됨
이러한 유형의 문제를 reference cycle 이라고 하며 reference counting 으로 해결할 수 없음
Generation
- 가비지 컬렉터는 메모리의 모든 객체를 추적함, 새로운 객체는 1세대 가비지 수집기에서 life(수명)을 시작함. Python 이 세대에서 가비지 수집 프로세스를 실행하고 객체가 살아남으면, 두 번째 이전 세대로 올라감
- 각 세대마다 가비지 컬렉터 모듈에는 임계값 개수 개체가 있음, 객체수가 해당 임계값을 초과하면 가비지 콜렉션이 콜렉션 프로세스를 추적함
- 생성된지 얼마 안된 객체는 짧은 수명을 가지며 메모리에서 해제 될 확률이 높고, 오래 된 객체는 메모리에서 해제될 확률이 적다는 가설을 기반으로 접근함
- Generation 은 (0,1,2) 단계로 나뉘고 cyclic garbage collector로 부터 생존한 횟수로 기준을 나눔
import gc
# Get the current garbage collector thresholds
thresholds = gc.get_threshold()
print(thresholds)
// output (700, 10, 10)
참고
https://simbasimba.tistory.com/32
https://www.geeksforgeeks.org/garbage-collection-python/
https://hyperconnect.github.io/2023/05/30/Python-Performance-Tips.html
https://devguide.python.org/internals/garbage-collector/index.html
'언어 > 파이썬' 카테고리의 다른 글
[파이썬] - Dependency Injection (의존성 주입) (0) | 2024.01.20 |
---|---|
[파이썬] - Global Interpreter Lock (1) | 2024.01.14 |
[파이썬] - Mutable vs Immutable Objects (1) | 2024.01.04 |