파이썬 메모리 관리(참조 카운트, GC)

반디·2023년 3월 28일
0

Python

목록 보기
10/11

참조 카운트

  • 모든 객체는 참조 카운트가 0인 상태로 생성
  • 참조 카운트가 감소하다가 0이 되면 인터프리터가 회수, 메모리에서 삭제됨
참조 카운트 += 1참조 카운트 -= 1
다른 객체가 해당 객체를 참조객체에 대한 참조가 끊김
대입 연산자 사용, 함수에 인수로 전달, 컨테이터 타입 객체(리스트, 튜플, 클래스 등) 추가대입 해제, 함수에서 빠져나옴

Example

a = obj() #참조 카운트 = 1
func(a) #참조 카운트 = 2
#함수 완료, 참조 카운트 = 1
a = None #대입해제, 참조 카운트 = 0; 메모리에서 삭제!
https://en.wikipedia.org/wiki/Circular_reference

순환참조 (circular reference)
여러 객체가 원 모양을 이루며 서로를 참조하는 형태
참조 카운트로는 해결할 수 없으나 가비지 콜렉션으로는 해결 가능한 문제
사용자가 모든 객체에 대한 참조를 끊어서 객체에 접근할 수 없는 상황이어도 참조 카운트가 0이 되지 않을 수 있음

Example

def create_cycle():

	# create a list x
	x = [ ]

	x.append(x)

create_cycle()

가비지 컬렉션 (GC, garbage collection)

  • 메모리가 부족해지는 시점에 인터프리터에 의해 자동으로 호출
  • 명시적으로 호출할 경우, gc.collect() 이용
  • garbage collector는 메모리 내의 모든 object들을 추적
    • collector는 object를 총 3세대(generation)으로 구분
    • 새로 생성되는 object는 first generation
    • garbage collector로부터 살아남은 object는 상위 세대로 옮겨짐
    • 각 세대내에서, object가 일정수준(threshold)을 초과하는 경우, garbage collector는 garbage collection 프로세스를 수행
import gc
gc.get_threshold() #(700, 10, 10); 700: youngest
gc.get_count() #현재 각 세대내의 object 개수
gc.collect() #garbage collection 수행 
gc.set_threshold(1000, 15, 15) #각 세대의 threshold 설정

참고문헌

profile
꾸준히!

0개의 댓글