참조 카운트 += 1 | 참조 카운트 -= 1 |
---|---|
다른 객체가 해당 객체를 참조 | 객체에 대한 참조가 끊김 |
대입 연산자 사용, 함수에 인수로 전달, 컨테이터 타입 객체(리스트, 튜플, 클래스 등) 추가 | 대입 해제, 함수에서 빠져나옴 |
Example
a = obj() #참조 카운트 = 1
func(a) #참조 카운트 = 2
#함수 완료, 참조 카운트 = 1
a = None #대입해제, 참조 카운트 = 0; 메모리에서 삭제!
순환참조 (circular reference)
여러 객체가 원 모양을 이루며 서로를 참조하는 형태
참조 카운트로는 해결할 수 없으나 가비지 콜렉션으로는 해결 가능한 문제
사용자가 모든 객체에 대한 참조를 끊어서 객체에 접근할 수 없는 상황이어도 참조 카운트가 0이 되지 않을 수 있음
Example
def create_cycle():
# create a list x
x = [ ]
x.append(x)
create_cycle()
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 설정
참고문헌