Programing Language/Python

파이썬 메모리 구조 개요

칼쵸쵸 2025. 7. 29. 22:48

🐍 파이썬 메모리 구조 & 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. 가비지 컬렉션 동작 과정

  1. 참조 카운트 0인 객체 즉시 해제
  2. 주기적으로 순환 참조 탐색
  3. gc.collect()로 강제 실행 가능
  4. 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