[Python] Garbage Collection

김명섭·2024년 4월 12일

[Python]

목록 보기
5/11
  • 파이썬은 기본적으로 Reference Counting을 바탕으로 Garbage Collection을 진행하고 메모리를 관리한다.

  • Reference Counting
    모든 객체는 참조 당할 때 Reference Count를 증가, 참조가 없어지면 감소시킨다.
    그리고 count가 0이 되면 객체가 메모리에서 해제된다.
    sys.getrefcount() 를 이용해서 확인할 수 있다.

  • Garbage Collection
    3가지 세대와 그에 해당하는 임계값을 기준으로 주기적으로 관리한다.
    숫자가 큰 세대일 수록 오래된 객체이고, 최근에 생성된 객체에 대해 자주 실행한다.
    gc.get_threshold() 를 실행하면 700, 10, 10이 나온다.
    즉, 0세대=700, 1세대=10, 2세대=10 의 임계값을 갖는다.
    gc.set_threshold(1000, 100, 100) 으로 임계값을 설정할 수도 있다.

  • 0세대
    메모리에 객체 할당 횟수에 해제된 횟수를 뺀 값으로 객체 수를 의미한다.
    임계값을 초과하면 0세대 GC를 수행한다.

  • 1세대
    0세대 GC 이후 살아남은 객체를 1세대로 이동시킨 후 카운터를 1 증가시킨 후
    이 1세대 카운터가 임계값을 초과하면 1세대 GC를 수행한다.

  • 2세대
    1세대 GC 이후 살아남은 객체들에 동일한 방식으로 GC를 수행한다.

  • 과정

  1. 새로운 객체가 생성되면, 메모리와 0세대에 객체를 할당한다. 이 때, 객체 수가 0세대 임계값보다 크면 collect_generations()가 호출된다.

  2. collect_generations()는 2세대, 1세대, 0세대 순으로 검사를 수행

  3. 각 세대에 대해 임계값을 검사한 후 GC를 수행한다.

  • gc.collect()로 수동 실행도 가능하다.

더 자세한 공부가 필요함

profile
ML Engineer

0개의 댓글