-
[Python] - Garbage Collection개발/Python 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
'개발 > 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