본문 바로가기

Dev/Python

[Python] Garbage Collector

프로그램에서 메모리

메모리 관리를 하는 것은 매우 중요합니다.

- 사용하지 않는 메모리를 정리하지 않으면 비효율적인 현상이 발생하게 됩니다.

- 사용하고 있는 메모리를 정리하면 프로그램이 중단되며 데이터 손상이 발생할 수 있습니다.

 

Python의 메모리 관리

Cpython에서는 아래 2가지 방법을 이용하여 메모리 관리를 합니다.

1. Generational Garbage Collection(세대별 가비지 컬렉션)

2. Reference Couting(러퍼런스 카운팅)

 

파이썬은 주로 레퍼런스 카운팅을 사용하여 메모리를 관리합니다.

객체를 만들때마다 객체가 얼마나 사용되는지 카운팅을 합니다.

객체가 참조되면 증가하고 해제되면 감소합니다.

 

세대별 가비지 컬렉션은 주로 사용하는 방법은 아닙니다.

이것은 참조는 되어 있지만 접근할 수 없는 개체를 정리하는 역할을 합니다.

예를 들어 리스트를 선언하고 리스트에 해당 리스트를 추가하는 경우가 있습니다.

arr = []
arr.append(arr)
del arr

 

GC의 동작을 멈추는 방법

Python에서는 GC의 동작을 의도적으로 멈출 수 있습니다. 

Python 3.10 기준으로 gc모듈은 다음 함수를 제공합니다.

- gc.enable() : 자동 가비지 수거를 활성화

- gc.disable() : 자동 가바지 수거를 비활성화

- gc.isenabled() : 자동수거가 활성화되었으면 True

위 함수 외에도 여러 함수들이 존재합니다. (https://docs.python.org/ko/3.10/library/gc.html)

 

GC의 종료가 신중해야 하는 이유는 사용된 메모리에 대한 반환이 없을 경우

다른 영향이 있을 수 있다는 것 입니다.

 

한 가지 사례로 Instagram에서 Django 사용 중 성능 향상을 위해 GC를 종료하였는데, 오히려 다른 이슈가 발생하였다고 합니다.

 

 

이 글을 작성하는 이유는 GC를 비활성화시킬 수 있는 경우에 대해 알아보며 작성하게 되었습니다.

여러 글들을 참고해보니 순환 참조를 만들지 않을 경우, GC를 비활성화시켜도 된다고 합니다.

 

 

 

참조 : https://dingrr.com/blog/post/python-garbage-collector