garbage collection in python

About_work·2023년 2월 19일
0

python 기초

목록 보기
19/65

참조 링크

GC(Garbage Collector)

  • C#, JS, Python 등의 언어에서는 GC를 기본적으로 제공
  • GC는 메모리를 자동으로 관리해주는 과정임

Python의 Garbage Collection 구현

  • CPython에서의 메모리 관리와 Garbage Collection은 두가지 측면이 있다.
    • reference counting
    • generational garbage collection

CPython의 reference counting

  • CPython에서의 주요 GC mechanism은 reference counts 방식
  • 기본 C형 객체를 반들 때마다, Python 유형(list, dict 또는 function)과 reference count가 생성된다.
  • 매우 기본적으로 Python 객체의 reference count는 객체가 참조될 때마다 증가하고, 객체의 참조가 해제될 때 감소한다.
    • 해제의 예: del a
  • 객체의 reference count가 0이 되면, 객체의 메모리 할당이 해제된다.

Python의 reference counting

  • 참조 횟수를 증가시키는 방법은
    • 변수에 객체 할당
    • list에 추가하거나, class instance에서 attribute으로 추가하는 등의 data structure에 객체 추가
    • 객체를 함수의 인수로 전달
import sys
a = 'hello'
b = [a]
sys.getrefcount(a)
>>>
3

Generational Garbage Collection

문제 제기

  • 아래와 같이 객체 순환참조의 경우, reference counts가 0이 되지 않아, (객체는 더 이상 접근할 수 없지만) 메모리 할당이 해제되지 않는다. -> garbage가 된다.
a = []
a.append(a)
del a
sys.getrefcount(a)
>>>
1

Generational Garbage Collector

  • GC는 메모리의 모든 객체를 추적한다.
  • Generation 이란?
    • 새로운 객체는, 1세대 Garbage Collector에서 life를 시작한다.
    • Python이 이 세대에서 Garbage collection process를 실행하고 객체가 살아남으면, 두 번째 이전 새대로 올라간다.
    • Python Garbage Collector은 총 3세대에며, 객체는 현재 세대의 Garbage Collection process에서 살아남을 때마다, 이전 세대로 이동한다.
  • Threshold 개념
    • 각 세대마다 garbage collector 모듈에는, threshold 값 개수의 개체가 있다.
    • 객체 수가 해당 threshold를 초과하면, Garbage Collection이 Collection process를 trigger합니다.
    • 해당 수집 프로세스에서 살아남은 객체는, 다음 세대로 옮겨집니다.
    • 0세대에 가까울수록 (0~2세대 중) 더 자주 garbage colection을 하도록 설계되어 있는데, 이는 어린 객체가 오래된 객체보다 해제될 가능성이 훨씬 높다는 가설 떄문이다.

TODO...

weak reference & strong reference

  • application이 object에 strong reference를 가지고 있는 경우.
    • Garbage collector은 application에 의해 사용되고 있는 object를 수집할 수 없다. (application의 code는 해당 object에 도달할 수 있지만,)
  • weak reference
    • (application의 code가 해당 object에 도달할 수 있을 때) garbage collector 가 해당 객체를 수집할 수 있도록 함.
    • weak reference는 "strong references 가 존재하지 않는 동안 object가 수집될 때까지의" 불확실한 시간 동안만 타당하다.
      • 즉, 너가 weak reference를 사용할 때, application은 여전히 해당 object에 대해 strong reference를 획득할 수 있다.
    • weak references는 많은 메모리를 사용하는 objects에서 유용하다. 그러나 만약 objects가 garbage collection에게 reclaimed되면 쉽게 제 생성될 수 있다.
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글