Language/Python

Garbage Collection

12.tka 2020. 12. 12. 23:53
728x90

이번 글에서는 Garbage Colleciton이 무엇인지에 대해서 알아보도록 하자.

 

1. GC(Garbage Collection)란?

쓰레기 수집(Garbage Collection, GC)은 메모리 관리 기법 중 하나이다.

프로그램이 동적으로 할당했던 메모리 영역 중에서 필요 없게 된 영역을 해제하는 기능이다.

C#, JS, Python 등의 언어는 GC를 기본적으로 제공하며, C와 C++는 malloc(), free()와 같은 저수준의 메모리 관리 함수를 제공한다. 물론, libgc를 활용하여 GC를 library 형태로 사용할 수 있다.

 

2. GC(Garbage Collection) 구현

Python의 GC는 레퍼런스 카운팅(reference counting)과 세대별 가비지 컬렉션(generational garbage collection) 두 가지 방법을 사용한다.

 

2-1. 레퍼런스 카운팅(reference counting)

레퍼런스 카운팅 방식은 객체가 참조될 때마다 증가하고 객체가 참조가 해제될 때 감소한다. 레퍼런스 카운트가 0이 되면 객체의 메모리 할당이 해제된다. 하지만 순환 참조(자기 자신을 가리키는 것), 서로를 참조하는 경우에는 레퍼런스 카운팅으로 메모리 관리를 할 수 없다. 따라서 세대별 가비지 컬렉션이 필요하다.

* sys.getrefcount()로 참조 횟수를 알 수 있다.

 

2-2. 세대별 가비지 컬렉션(generational garbage collections)

세대별 가비지 컬렉션은 Generational Hypothesis 가설(대부분의 객체는 생성되고 오래 살아남지 못하고 곧바로 버려진다, 젊은 객체가 오래된 객체를 참조하는 상황은 드물다)을 기반으로 동작한다.

세대별 가비지 컬렉션은 Python의 메모리 관리에서 레퍼런스 카운팅을 보조하는 용도로 사용한다.

세대별 가비지 컬렉션의 핵심은 세대(0, 1, 2)와 임계값(threshold)이다. 각 세대마다 가비지 컬렉션 모듈에는 임계값이 있으며 각 세대의 객체 수가 해당 임계값을 초과하면 가비지 컬렉션을 실행한다. 0세대에서 살아남은 객체는 다음 1세대로 옮겨지고 1세대의 카운트는 1 증가한다. 이런 방식으로 젊은 세대에서 임계값이 초과되면 오래된 세대로 위임하는 방식으로 동작한다.

* gc.get_threshold(), gc.get_count()를 통해 세대별 임계값, 객체 카운트를 확인할 수 있다.

 

3. GC(Garbage Collection)의 장점

프로그래머는 동적으로 할당한 메모리 영역을 관리할 필요가 없다.

메모리 누수, 유효하지 않은 포인터 접근의 문제점을 해결할 수 있다.

 

4. GC(Garbage Collection)의 단점

어떤 메모리를 해제할지 결정하는데 비용이 든다.

객체가 필요 없어지는 시점을 프로그래머가 알고 있어도 GC 알고리즘이 메모리 해제 시점을 추적해야 한다.

GC가 일어나는 타이밍이나 점유 시간을 미리 예측하기 어려워 실시간 시스템에는 적합하지 않다.

-> 실제로 Instagram은 Python의 GC를 사용하지 않는다.

728x90

'Language > Python' 카테고리의 다른 글

[Python] Decimal이란  (0) 2023.07.09
[ Python ] 점프 투 파이썬 전면 개정 2판 서평  (0) 2023.07.01
[Python] *args, **kwargs  (0) 2022.07.03
[Python] mac 경로 설정  (7) 2022.01.14
Python의 장점과 단점  (0) 2020.12.12