개발/Python

[Python] - Garbage Collection

Dortmoot 2022. 9. 19. 01:47

GB( Garbage Collect )


현대적인 언어에서 필수적인 존재로, 메모리를 관리에 도움을 준다.
  • C#, JS, Python 등의 언어는 GC를 기본적으로 제공하며, C, C++과 같은 언어에서는 malloc(), free()와 같은 저수준의 메모리 관리 함수를 제공한다.

 

GC를 왜 공부해야 하나?

 

기존 메모리 관리 문제점

1. 메모리가 남아있는 경우

2. 사용 중인 메모리 삭제

 

Python의 Garbage Collection


  • Cpython에서의 메모리 관리 측면
  • Reference Counting , Generational garbage collection 두 가지 형태로 참고한다.
$ a = [100]
$ a = [200]

# Object 100 -> 메모리 해제
# Object 200 -> 메모리 할당

 

1. Reference Counting (참고)

  • Python의 Object는 reference 될 때 마다 reference count 값이 1씩 증가하고, 0이 되면 객체 메모리 할당이 해제된다.
  • Reference Count를 증가시키는 방법
    • Variable에 Object 할당
    • List , Class, data Struceture Object 추가
    • Function Parameter 전달
$ import sys
$ a = ['1'] # count
$ sys.getrefcount(a) # count
> 2

 

Cyclic reference

  • Circular Reference 가 발생하면, count 값은 0보다 크기 때문에 메모리에서 해제가 불가능
  • 결국 특정 Object는 메모리 해제가 불가능하다.
  • 참고
$ a = []
$ a.append(a)
$ del a

 

2. Generational garbage collection

1. generation ( 3개 )

2. threshold

 

  • GC 는 Python의 모든 Object를 Trace합니다. 만약 Object의 수가 Threshold 값을 넘게 되면, GC처리에 들어가게 됩니다.
  • 이 때를 first generation이라고 하며, 생존한 Object는 Older Generation으로 이동합니다.
  • Reference Counting과 다르게 threshold 값은 설정이 가능합니다.
  • 다만 큰 문제점은, GC를 실행하기 위해서는 완전 중지가 되어야합니다. 이 때문에 빈번하게 발생되면 수행 성능이 낮아지게 되고 CPU oscillation이 발생

 

  • gc 실행
gc.collect()
  • gc 사용 X
gc.disable()

 

  • gc의 각 값은 ( 1generation , 2generation, 3generation ) 으로, 각 값의 임계치를 나타냅니다.
  • 임계치를 넘기 전 까지는 사용되지 않는 Object들도 남아있습니다.
$ import gc
$ gc.get_threshold()
-> (700, 10, 10)
$ gc.get_count()
-> (33, 10, 0)

 

참고 

https://docs.python.org/3/library/gc.html

https://medium.com/dmsfordsm/garbage-collection-in-python-777916fd3189

https://blog.winterjung.dev/2018/02/18/python-gc

https://twinparadox.tistory.com/623