프로그래밍/Python

[Python] 파이썬의 변수 저장 방식과 메모리 해제(Garbage Collector)

나무늘보Programmer 2024. 3. 29. 18:10

 

파이썬의 변수 저장 방식

파이썬은 모든것이 객체로 이루어져 있는 언어이다.
메모리 할당을 받는 방식은 동적 메모리 할당이며 메모리는 파이썬 메모리 관리자가 관리해준다.

따라서, 모든 변수는 객체의 값이 아닌 주소 값을 가리키는 방식으로 할당 된다!

만일 X, Y라는 변수에 값은 값이 3을 넣는다고 가정하면 아래와 같이 3이라는 객체의 주소 값을 가리키는 것이다!

이러한 파이썬의 특징 때문에 파이썬의 연산자인 'is'를 값 비교에 사용하면 안된다!

 

[Python] is연산자와 ==연산자의 차이점

is연산자와 == 연산자의 차임점? 파이썬에서 두 값을 비교할때는 '=='연산자를 사용하며 비교를 하게된다. 이는 두개의 값이 같은지 비교를 하는 연산자이기 때문이다. is연산자 역시 두 값을 비교

slowprogramer.tistory.com

메모리 해제(Garbage Collector)

사실 파이썬은 고급 언어이기 때문에 C나 C++등 처럼 직접 메모리 할당 해제를 할 필요는 없다.
하지만 뭐든 알면 살이 되니 알아보자!

python은 Cython이라는 C 언어의 구현이 되어있고 이는 두가지 방법으로 메모리를 처리한다.

Reference Counting

Python의 모든 객체는 PyObject라는 객체를 상속 받는데 이 객체는 본인이 얼마나 참조되었는지 기억을 하고 있다.
따라서, 본인이 참조되고 있지 않다(나를 가리키는 변수가 0개이다)라고 하면 메모리를 해제하게 된다.

Generation Garbage Collection

해당 방식에서는 2가지의 개념을 알아야 한다.

Generation

파이썬의 Garbage Collection은 모든 객체를 추적을 하게 되는데 하나의 세대(Generation)에서 해제가 안되면(살아남으면) 다음 세대로 보낸다.

Threshold

파이썬은 각 세대에 임계값(Threshold)를 가지고 있고 임계값이 넘으면 Garbage Collection(메모리 해제)를 진행한다.

위의 두 특성을 이용해 어떠한 객체가 2번 할당후 1번 해제된뒤 삭제되는 경우 Reference Couning 방식으로 해결 못하는 문제(Refernce Cycle)을 해결할 수 있다.

해제는 만든지 얼마 안된 객체부터 일어나는데 이는 "만든지 얼마 안된 객체가 오래된 객체보다 해제될 가능성이 높다"라는 'generational hypothesis'에 의거해서 실행된다