새소식

ML Development/Python - 2022.06.03

Python의 메모리 관리 방법 알아보기

  • -

Python의 모든 것은 객체다

파이썬의 메모리 관리 방법을 이해하려면, 우선 파이썬의 모든 것이 객체라는 것을 이해해야 한다.

이는 파이썬의 모든 것은 Heap 영역에 동적으로 할당된 객체를 참조하는 것이라는 말과 동일하다.

실제로 파이썬의 메모리 할당 과정은 다음과 같다.

그림에서 알 수 있듯, Heap 메모리 영역에 동적으로 할당된 객체를 모든 것(변수, 함수)들이 참조하는 구조다. 메모리가 동적으로 할당 된다는 것은, 결국 런타임 시 메모리가 할당된다는 것을 의미한다. 파이썬의 프로그램은 Byte-code(바이트 코드)를 인터프리터가 한 줄 씩 읽어가며 실행되기 때문에 동적 할당과 잘 맞다.

 

메모리 해제?

동적으로 메모리를 할당할 경우, 자료의 크기 등을 자유롭게 관리할 수 있어 편리하다는 장점이 있다.

하지만 메모리를 효과적으로 사용하려면, 사용 후 메모리를 직접 해제해줘야 한다.

그래서 다른 언어에선 freedelete 같은 것을 활용해서 동적으로 할당된 메모리를 해제한다.

 

파이썬에선 모든 것이 동적으로 할당되지만, 메모리 해제에 대해서 별로 큰 고민 없이 사용할 수 있다.

이는 파이썬이 알아서 사용하지 않는 객체에 대해서 메모리 할당을 해제 해주기 때문이다.

 

Reference Counting(RC)

파이썬은 사용하지 않는 객체의 메모리를 알아서 해제하기 위해서 RC를 활용한다.

앞서 파이썬의 모든 것은 동적으로 할당된 객체를 참조하는 것이라고 했다.

그래서 RC는 참조 횟수를 세는 방식으로 메모리를 관리한다.

 

만약 참조 횟수가 0이 되면, 더 이상 필요하지 않다고 생각해 메모리를 해제한다.

 

RC는 간단하고 직관적이지만 순환 참조가 발생할 경우 처리할 수 없다는 단점도 있다.

순환 참조는 발생 상황을 그림으로 보면 아래와 같다.

[세마나] Python Memory Management (oopy.io)

 

Automatic Gabage Collections(GC)

RC의 순환 참조 문제를 해결하기 위해, 파이썬에서 추가로 활용하는 메모리 관리 방법이다.

GC는 순환 참조가 발생할 가능성이 높은 객체를 확인하고, 문제가 있다면 알아서 해제한다.

이러한 GC는 RC 외 동작하는 것이기에, 추가로 오버헤드가 생긴다는 특징이 있다.


참조

 

Under the C: PyObject

파이썬의 모든 자료형의 부모 PyObject를 알아봅시다

blog.hanlee.io

 

[Python] 파이썬의 메모리 관리

인스타그램이 GC를 사용하지 않은 뒤 성능이 10%정도 향상 됐다는 글을 봤습니다. GC가 어떻게 동작하는지 궁굼하기도 했고 평소 파이썬으로 프로그래밍 하는 걸 좋아하기 때문에 깊게 이해해보

dc7303.github.io

 
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.