개발/Python
[Python] - Garbage Collection
Dortmoot
2022. 9. 19. 01:47
GB( Garbage Collect )
현대적인 언어에서 필수적인 존재로, 메모리를 관리에 도움을 준다.
- C#, JS, Python 등의 언어는 GC를 기본적으로 제공하며, C, C++과 같은 언어에서는 malloc(), free()와 같은 저수준의 메모리 관리 함수를 제공한다.
GC를 왜 공부해야 하나?
- GC는 메모리를 자동으로 관리한다.
- 자동으로 메모리를 관리하여 최적화가 덜 되어있다.
- 인스타그램은 Python GC를 사용하지 않는다. (Instagram이 Python garbage collection 없앤 이유 참고)
기존 메모리 관리 문제점
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