메모리 관리 기법 중 하나, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요 없게 된 영역을 해제하는 기능이다. C#, JS, Python 등의 언어는 GC를 기본적으로 제공한다.
Python의 GC는 레퍼런스 카운팅(reference counting)과 세대별 가비지 컬렉션(generational garbage collection) 두 가지 방법을 사용한다.
레퍼런스 카운팅 방식은 객체가 참조될 때마다 증가하고 객체가 참조가 해제될 때 감소한다. 레퍼런스 카운트가 0이 되면 객체의 메모리 할당이 해제된다. 하지만 순환 참조(자기 자신을 가리키는 것), 서로를 참조하는 경우에는 레퍼런스 카운팅으로 메모리 관리를 할 수 없다. 따라서 세대별 가비지 컬렉션이 필요하다.
세대별 가비지 컬렉션은 Generational Hypothesis 가설(대부분의 객체는 생성되고 오래 살아남지 못하고 곧바로 버려진다, 젊은 객체가 오래된 객체를 참조하는 상황은 드물다)을 기반으로 동작한다.
Python의 메모리 관리에서 레퍼런스 카운팅을 보조하는 용도로 사용한다. 세대별 가비지 컬렉션의 핵심은 세대(0, 1, 2)와 임계값(threshold)이다.
각 세대마다 가비지 컬렉션 모듈에는 임계값이 있으며 각 세대의 객체 수가 해당 임계값을 초과하면 가비지 컬렉션을 실행한다. 0세대에서 살아남은 객체는 다음 1세대로 옮겨지고 1세대의 카운트는 1 증가한다. 이런 방식으로 젊은 세대에서 임계값이 초과되면 오래된 세대로 위임하는 방식으로 동작한다.
장점
단점