본문 바로가기
python

파이썬 메모리 관리

by hyundy 2021. 10. 29.

파이썬에서 메모리 관리는 어떻게 하는지 궁금해서 찾아 보았다. 

 

C, C++ 로 개발할때 메모리 할당 해제를 직접 해줘야 하지만 파이썬에서는 인터프리터에 의해 자동으로 관리 된다. 

메모리 할당과 해제를 명시적으로 수행 하지 않는 만큼 객체가 더이상 사용되지 않으면 알아서 해당 객체를 메모리에서 해제 하게 되는데 

이때 레퍼런스 카운팅과 가비지 컬렉션 두가지 방법을 사용 한다. 

 

레퍼런스 카운팅(Reference Counting)

모든 객체는 참조 당할 때 레퍼런스 카운터를 증가 시키고 참조가 없어질 때 카운터를 감소 시킨다. 카운터가 0이 되면 객체가 메모리에서 해제 된다. 

import sys

a = [1,2,3,4]
print(f'count {sys.getrefcount(a)}')
b = a 
print(f'count {sys.getrefcount(a)}')
c = a
print(f'count {sys.getrefcount(a)}')
c = 0
print(f'count {sys.getrefcount(a)}')
b = 0 
print(f'count {sys.getrefcount(a)}')

위의 코드 예제를 보면 count의 증감을 볼수 있다. 

 

가비지 컬렉션(Garbage Collection)

동적으로 할당된 메모리 영역 가운데 더 이상 사용할 수 없게 된 영역을 탐지 하여 자동으로 해제하는 것.

메모리에 존재하는 객체를 오래된 객체와 젊은 객체로 나눌수 있는데, 대부분 객체는 생성되고 곧바로 버려지기 때문에 젊은 객체가 더 많이 존재한다. 즉 최근에 생성된 객체에 대해 자주 GC를 수행한다. 

 

가비지 컬렉터는 내부적으로 generation(세대)과 threshold(임계값)로 가비지 컬렉션 주기와 객체를 관리한다.

총 3세대로 객체는 현재 세대의 가비지 수집 프로세스에서 살아 남을때 마다 이전 세대로 이동한다.

0 ~ 2 세대로 구분 하며 최근 객체는 0세대, 올드 객체는 2세대로 이동한다. 

 

정리

파이썬에서 메모리 관리로 레퍼런스 카운팅과 가비지 컬렉션을 알아 봤는데 사실 레퍼런스 카운팅도 가비지 컬렉션이라 부른다. 

파이썬에서는 레퍼런스 카운팅 방식으로 가비지 컬렉션을 수행해 메모리를 관리하고 순환 참조 상황만 별도의 가비지 컬렉터로 해결하기 때문이다. 

 

여러 레퍼런스들을 확인 해 본 결과 파이썬도 메모리 관리를 직접 할수는 있지만 크게 영향을 미치지 않아 애초에 메모리 효율성이 중요한 분야에서는 사용하지 않는다고 한다. 그러므로 내가 원하는 것을 만들기 위해 더 집중 하자 

 

'python' 카테고리의 다른 글

*args, **kwargs  (0) 2021.10.21
Decorator  (0) 2021.10.21
Closure  (0) 2021.10.21
first_class function  (0) 2021.10.21
python package pandas  (0) 2021.10.08