Python 메모리 관리

토닉·2021년 7월 27일
2

DataStructure

목록 보기
3/5
post-thumbnail

🙉 파이썬에서 메모리 관리는?

C/C++과 같이 프로그래머가 직접 메모리 관리를 하지 않고 레퍼런스 카운트(Reference Counts)와 가비지 컬렉션(Automatic Garbage Collection)에 의해 관리됩니다.

👍 데이터 구조, 힙과 스택에 대해 궁금하다면 아래에 링크를 클릭해주세요.

python은 레퍼런스와 객체를 이용해 메모리를 관리합니다.

  • 레퍼런스 : 지역 변수, 매개 변수를 뜻하고 객체의 주소를 의미하고 스택 영역에 할당됩니다.
  • 객체: 실제 데이터가 저장된 곳으로 데이터 타입에 맞게 힙 영역에 메모리를 할당합니다. class 같은 객체도 이 곳에 포함됩니다.

관리1 : 레퍼런스 카운트

레퍼런스 카운트

  • 객체 마다 레퍼런스를 카운트한다. 객체를 참조하는 레퍼런스가 추가될 때 증가하고, 참조가 삭제될 때 감소한다. 이 때 0이 되면 메모리가 할당 해제됩니다.
  • 레퍼런스 카운트는 가비지 컬렉션이라고도 불린다.

  • 함수가 호출되면 함수와 변수(레퍼런스)는 호출된 순서대로 스택 메모리에 할당되고
  • 함수 안의 변수의 데이터는 힙 메모리에 할당된다.
  • 함수 호출이 끝나면(return) 스택에 나중에 호출된 함수부터 메모리 할당이 해제된다.(Last In First Out)

Last In First Out: 스택 메모리의 특징으로 나중에 할당된 메모리가 먼저 해제됩니다.(후입선출)

파이썬 코드를 예시로 한다면

빨간색 상자

  • 10이라는 int 객체를 만들고 x 가 가르키는 형태
  • y = x 는 x 가 가르키는 객체를 y가 똑같이 가르킨다는 의미
  • id() 를 사용하면 두 변수가 같은 id 값을 갖고 있는 것을 알 수 있다.

하늘색 상자

  • x = x + 1 일 때는 x 가 11이라는 새로운 객체를 레퍼런스하게 된다.
  • z = 10 은 이미 10이라는 객체가 있기 때문에 해당 객체를 레퍼런스하게 된다.

파란색 상자

  • Car() 라는 객체를 z가 가르킨다.

관리2: Automatic Garbage Collection

Automatic Garbage Collection

  • 레퍼런스 카운트의 문제점인 순환 참조 이슈를 해결하기 위해 구현한 가비지 컬렉션

Automatic Garbage Collection은 아직 이해하지 못해서 순환 참조 이슈를 해결한다는 정도만 알고 있습니다 ㅠㅠ


참고자료

profile
우아한테크코스 4기 교육생

1개의 댓글

comment-user-thumbnail
2023년 9월 4일

파이썬에서 함수 호출 시 레퍼런스와 객체의 메모리 관리 구조에 대해 궁금했는데 객체는 힙에서 관리하고 레퍼런스는 스택에서 관리하는거군요! 덕분에 파이썬 작동 구조가 좀 이해되네요 감사합니다 :)

답글 달기