오뚝이개발자

[Python] 파이썬 가비지 콜렉터란?(Garbage Collector; GC) 본문

Language/파이썬

[Python] 파이썬 가비지 콜렉터란?(Garbage Collector; GC)

땅어 2021. 11. 20. 15:47
728x90
300x250

 

 

프로그래밍 언어는 메모리 관리를 어떻게 할까?


프로그래밍 언어는 메모리 관리를 어떻게 하는 것일까? C나 C++ 같은 저수준의 언어는 malloc(), free()와 같이 메모리를 직접적으로 관리하는 함수들을 사용해 메모리 할당과 해제를 한다. 그런데 python, JS, C# 등의 언어를 사용할 때를 생각해보면 개발을 하는 우리는 "메모리"에 대해 생각하지 않고 코드를 짠다. 현대적인 언어로 오면서 메모리 관리는 점차 사람이 하지 않는 쪽으로 바뀌었다. 하지만 분명히 메모리가 어떠한 방식으로든 할당이 되어야 할 것이고, 이를 사람이 신경쓰지 않는다면 누군가가 대신해 주고 있다는 뜻이다. 특히, 파이썬에서 이를 해주는 것이 바로 가비지 콜렉터(Garbage Collector, 줄여서 GC)이다.

 

메모리를 직접 관리해주면?


아까 서두에서 C, C++ 같은 언어가 메모리를 개발자가 직접 할당, 해제해준다고 말했다. 그럼 이러한 경우 어떠한 단점이 있어서 점차 메모리를 신경쓰지 않아도 되는 언어들로의 발전이 이루어진걸까? 메모리를 사람이 직접 관리하면 아래와 같은 문제점들이 생길 수 있다.

1. 필요없는(사용하지 않는) 메모리를 해제해주지 않으면 memory leak이 발생한다.

2. 사용 중이던 메모리를 해제해버리면 프로그램이 중단되고, 데이터가 손실될 수 있다.

때문에 점차 이러한 메모리 관리를 언어 그 자체에게 맡기는 방향으로의 발전이 이루어진 것이다. 하지만 이것이 단점만 있는 것은 아니다. 사람이 직접 개입하면 좀 더 훌륭하게 메모리 최적화를 할 수 있고, micro managing이 가능하다. 이러한 optimization이 중요한 분야가 따로 있다. 우주항공 분야의 프로그램들이 특히 그러하다. (대부분 Jop Posting을 보아도 C나 C++ 같은 언어는 특정하게 뽑는 분야가 정해져있다.)

또한 개발자의 개인적인 차원에선 이러한 언어들을 한 번쯤 배워두고 사용해보는 것이 굉장히 좋은 경험이 되는 것 같기도 하다. 이것은 내 개인적인 생각이지만! 나는 C, C++을 가장 처음으로 배웠고, 그 다음으로 Python을 사용하였다. 그런데 C를 배우고나서 python을 배울때는 생각보다 습득이 빠르고 쉬웠다. 거꾸로 생각해보니 C는 python보다 배우기가 어려웠던 것 같다. 그 이유가 바로 메모리를 사람이 모두 관리해주기 때문이다. 하지만 그러한 C를 배웠을 때 생각했던 메모리를 어떻게 할당해줄지에 대한 사고 방식이 분명 도움이 되었다.(생각보다 python 같은 언어를 사용하면 메모리에 대해 생각하면서 코드를 짜볼 기회가 정말 거의 없다, index range 벗어나고 이런거 말고)

 

파이썬의 GC


Cpython에서 주로 사용하는 메모리 관리법은 레퍼런스 카운팅(Reference Counting)이다. 쉽게 말해 우리가 객체를 만들 때 그것이 얼마나 자주 사용되는지 카운트하는 것이다. 캐시 메모리의 교체 방식에서 LRU(Least Recently Used)가 참조 횟수를 카운트해서 victim을 고르는 것과 비슷하다.

즉, 파이썬은 우리가 객체를 생성해서 사용할 때마다 해당 객체의 reference count를 1씩 증가시키고, 해제할 때 1씩 감소시킨다. 이것이 0이 되면 객체의 메모리 할당이 해제된다.

 

GC와 프로그램의 성능


GC는 프로그램의 성능에 영향을 미친다. 가비지 컬렉션을 수행하려면 프로그램을 완전히 중지해야 한다. 따라서 객체가 많을수록 가비지를 컬렉션하기 위해 더 많은 시간이 필요하다. 가비지 컬렉션 주기가 짧다면 여유 메모리를 확보할 순 있지만 프로그램이 중단되는 상황이 많이 발생한다. 반대로 주기가 길다면 프로그램이 자주 중단되지는 않지만 메모리 공간에 가비지가 많이 쌓이게 된다.

 

 

 

728x90
300x250
Comments