Python

Python의 메모리 관리 방식(Garbage Collection 포함)

두잇 두두 2025. 3. 10. 21:43
728x90

파이썬의 메모리 관리 방식은 참조 카운팅과 가비지 컬렉션 두 가지 주요 메커니즘

 

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(): 객체의 메모리 크기를 확인