ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] - Garbage Collection
    개발/Python 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

    '개발 > Python' 카테고리의 다른 글

    [Python] - Requirements  (1) 2022.09.26
    [Python] - Cyclic reference  (0) 2022.09.19
    [Python] - 동작원리( Build , hybrid )  (0) 2022.09.18
    [Python] - Decorator  (0) 2022.09.02
    [Python] - Closure  (0) 2022.07.28

    댓글

Designed by Tistory.