파이썬의 메모리 관리 방식은 참조 카운팅과 가비지 컬렉션 두 가지 주요 메커니즘
1. 참조 카운팅(Reference Counting):
Python은 참조 카운팅 방식으로 메모리를 관리 객체가 몇 번 참조되는지 추척, 참조 카운트가 0이 되면 해당 객체를 메모리에서 자동으로 해제
참조가 사라지거나 del로 객체를 삭제할 때 참조 카운트가 감소
참조 카운트가 0이 되면 객체는 자동으로 메모리에서 해제
한계:
Circular Refereces(순환 참조): 객체들이 서로를 참조하는 구조일 때, 참조 카운트만으로는 이를 해결x
예를 들어 두 객체가 서로를 참조하는 경우, 각각의 참조 카운트 1, 실제로 객체들 사용x 메모리에서 해제되야 함
2. 가비지 컬렉션(GC)
순환 참조 문제를 해결하고 사용되지 않는 객체를 주기적으로 정리
참조 카운팅과 함께 동작
Generational Garbage Collection: 객체를 3개의 Generation(세대)로 나누어 관리
새로 생성 객체는 0, 살아 남을수록 1, 2세대로 이동
- 세대 0: 새로 생성된 객체들이 포함되며, 가비지 컬렉션이 자주 발생
- 세대 1: 살아남은 객체들이 포함되며, 가비지 컬렉션이 덜 자주 발생
- 세대 2: 오랜 시간 동안 살아남은 객체들이 포함되며, 가비지 컬렉션이 거의 발생하지 않음
3. 작동 원리:
주기적인 스캔을 통해 객체들의 참조 관계를 추적, 애플리케이션이 여유를 가질 때 작동?
gc.collect(): 강제로 가비지 컬렉션 수행
gc.get_stats(): 가비지 컬렉터의 동작 통계 정보를 반환
4. 메모리 관리 최적화 기법:
del: 객체를 삭제하여 참조 카운트를 0으로 만듬
순환 참조가 발생하는 경우 가비지 컬렉터가 처리하지만 GC 비용이 추가되므로 주의
waekref 모듈을 사용해 순환 참조 문제를 피할 수 있음
weakref는 객체가 참조 되고 있을 때 참조 카운트를 증가시키지 않으며 객체가 메모리에서 해제되면 자동으로 참조 제거
5. 메모리 관련 도구
sys.getsizeof(): 객체의 메모리 크기를 확인
'Python' 카테고리의 다른 글
Python의 다중 상속과 MRO(Method Resolution Order)의 동작 방식 (0) | 2025.03.05 |
---|---|
__new__와 __init__의 차이 (0) | 2025.03.05 |
Python/Django 기술면접 질문 (0) | 2025.03.05 |
스트라이드와 슬라이스를 한 식에 함께 사용하지 말라 (0) | 2025.02.06 |
:= 바다코끼리 연산자 (0) | 2025.02.06 |