Python의 가비지 컬렉터
우리가 쓰고 있는 대부분의 언어는 매니지드 코드로 런타임 환경이 더해진 언어이다. 이는 런타임 환경에 의존적인 코드인데 개발자를 위해 많은 서비스를 제공한다. 대표적으로 가비지 콜렉터(GC)가 있다. 언매니지드 언어는 하드웨어에서 직접 실행될 수 있지만 직접 개발자를 위한 서비스를 만들어야 한다.
가비지 컬렉터는 프로그램이 동적으로 할당한 메모리 영역 중에서 더 이상 사용되지 않는 영역을 자동으로 찾아서 해제하는 프로세스이다. 왜냐하면 파이썬은 개발자가 직접 메모리를 관리하지 않고, 가비지 컬렉터가 메모리 일부를 자동화하여 관리한다. 이는 메모리 누수를 방지하고 프로그램의 안정성을 높이는 데 도움을 줍니다.
가비지 컬렉터를 알아야 하는 이유
개발자 자신이 작성한 코드가 메모리를 어떻게 사용하는지 정확히 이해하고 있어야 한다. 그렇지 않으면 메모리 누수가 발생하게 된다.
메모리 누수는 프로그램에서 더 이상 사용하지 않는 메모리를 해제하지 않고 계속 유지하하는 상태를 의미하며 시스템 성능 저하시키고, 심한 경우 프로그램이 더 이상 메모리를 할당받지 못해 중단되는 원인이 된다.
작동 방식
참조 카운팅(reference counting) 방식
Python의 메모리 관리 시스템은 기본적으로 참조 카운팅 방식을 사용한다. 객체에 대한 참조가 더 이상 없을 때, 즉 참조 카운트가 0이 되면 해당 객체는 즉시 메모리에서 해제된다..
- 객체 생성 시 참조 카운트는 1로 설정.
- 참조가 추가될 때마다 카운트가 증가하고, 참조가 제거될 때 감소.
- 참조 카운트가 0이 되면 객체는 해제.
예시:
import sys
a = 'hello' # 참조 카운트 1
b = a # 참조 카운트 2
sys.getrefcount(a) # sys 함수 자체적으로 참조 카운트 1 증가
# 출력: 3
순환 참조와 세대별 수집 (Generational Collection)
참조 카운팅만으로는 순환 참조를 처리할 수 없다. 순환 참조는 두 객체가 서로를 참조하여 참조 카운트가 0이 되지 않는 상황을 말한다.
예시:
a = []
a = a.append(a) # 리스트 a가 자기 자신을 참조
del a # 변수 a 삭제 (리스트는 여전히 순환 참조로 남아 있음)
이 문제를 해결하기 위해 Python은 Generational Collection(세대별 수집) 방식을 사용합니다. 객체를 생성 시점에 따라 세대(0세대, 1세대, 2세대)로 분류하고, 각 세대를 주기적으로 검사합니다. 젊은 세대는 자주, 오래된 세대는 덜 빈번하게 검사하여 효율성을 높이고, 프로그램의 선능 저하를 최소화한다.
세대별 객체 정보:
import gc
gc.get_threshold()
# 출력: (700, 10, 10)
# 700: 0세대 객체 수 한계
# 10: 1세대로 승격된 객체 수 한계
# 10: 2세대로 승격된 객체 수 한계
세대별 객체는 0세대에서 생성된 후 일정 횟수의 가비지 컬렉션을 거쳐 생존할 경우, 다음 세대로 승격됩니다. 세대별 수집은 주로 젊은 세대(0세대)를 자주 검사하여 성능을 최적화하고, 오래된 세대(1세대 및 2세대)는 덜 빈번하게 검사합니다.
마무리
Python의 가비지 컬렉터는 참조 카운팅과 세대별 수집 방식을 결합하여 효율적으로 메모리 관리를 한다. 이를 이해하면 메모리 누수 문제 예방과, 프로그램의 안정선을 높이는데 도움이 된다. 하지만 가비지 컬렉터를 잘못 활용하거나 임계값을 부적절하게 조정하면 오히려 성능이 저하될 수 있으므로 주의가 필요하다.
참고
https://velog.io/@samkong/garbagecollection3
https://f-lab.kr/insight/understanding-garbage-collection-in-python
'Python' 카테고리의 다른 글
Python asyncio 비동기 처리 async/await (0) | 2025.01.09 |
---|---|
Redis-Py : ZSet(Sorted Set) 랭킹 구현 활용 (1) | 2024.12.08 |
[TIL]내이배움캠프 - DRF + React 좋아요 기능 (0) | 2024.05.10 |
[TIL]24.02.29 내일배움캠프 3주차 + 3과제 Class (1) | 2024.03.01 |