🐍 파이썬 메모리 구조 & GC 정리
1. 메모리 구조 개요
파이썬 인터프리터(CPython 기준) 메모리 구성:
- 스택(Stack)
- 함수 호출 시 로컬 변수, 참조 저장
- 함수 종료 시 자동 해제
- 실제 데이터가 아닌 객체 참조(포인터) 저장
- 힙(Heap)
- 모든 파이썬 객체(
list
,dict
, 사용자 정의 객체 등) 저장 - GC와 메모리 풀(Pymalloc) 관리
- 크기 동적 할당
- 모든 파이썬 객체(
- 코드/전역 영역
- 전역 변수, 상수, 함수 정의 저장
- 프로그램 종료 전까지 유지
2. 힙 메모리와 객체 구조
모든 객체는 PyObject 구조체로 관리됨.
typedef struct {
Py_ssize_t ob_refcnt; // 참조 카운트
struct _typeobject *ob_type; // 객체 타입
} PyObject;
ob_refcnt
: 참조 횟수 (GC 관리 기준)ob_type
: 객체 타입 정보
변수는 객체를 직접 담는 게 아니라 힙에 있는 객체 주소를 참조.
3. 메모리 관리 전략
① 참조 카운팅 (Reference Counting)
- 각 객체가 참조될 때마다 카운트 증가
- 참조가 0이 되면 즉시 해제
a = [1,2,3]
b = a
del a
del b # refcount=0 → 해제
- 장점: 즉시 해제
- 단점: 순환 참조 해결 불가
② 가비지 컬렉터 (GC)
- 세대별 수집(Generational GC) 사용
- 세대 구분:
- 0세대: 새 객체
- 1세대: 한 번 생존
- 2세대: 오래된 객체
순환 참조 해결 가능.
import gc
gc.collect() # 강제 GC 실행
③ 메모리 풀 (Pymalloc)
- 작은 객체(512바이트 이하)는 메모리 풀에서 관리
- 큰 객체는 OS malloc/free 직접 호출
4. 가비지 컬렉션 동작 과정
- 참조 카운트 0인 객체 즉시 해제
- 주기적으로 순환 참조 탐색
gc.collect()
로 강제 실행 가능- GC 주기 튜닝 가능
import gc
gc.set_threshold(700, 10, 10)
5. 메모리 구조 시각화
[스택] → 함수 호출 시 참조 저장
└─ a ───────┐
└─ b ───┐ │
│ │
[힙] │ │
[List]───┘ │
├── 1 │
├── 2 │
└── 3 │
│
[GC] ← refcount 관리 및 순환 참조 탐색
6. 메모리 최적화 팁
__slots__
사용: 객체 메모리 절감- 제너레이터 활용: 대규모 데이터 처리 시 효율적
- 불필요한 참조 해제:
del
명시적 사용 - Numpy/Pandas: 메모리 효율적(C 기반)
- GC 주기 조절: Spark/Airflow 등 대규모 파이프라인에서 유용
반응형
'Programing Language > Python' 카테고리의 다른 글
파이썬의 동작 과정 (3) | 2025.07.29 |
---|---|
Python 데코레이터(Decorator) (0) | 2024.11.27 |