CPython은 주로 참조 횟수로 객체 수명을 관리하고, 서로 물고 있는 순환 참조는 별도의 가비지 컬렉터가 찾는다.
a = []
b = a
del a
b.append(1) # 객체는 여전히 살아 있다객체가 왜 남는지 찾을 때 전역 캐시, 콜백, 예외 traceback, 닫히지 않은 작업이 참조를 붙드는지 본다. 순환 자체는 수집될 수 있지만, 불필요한 수명 연장은 메모리 피크를 키운다.
`weakref`는 객체의 수명을 연장하지 않는 참조다. 캐시나 부모 링크에 사용할 수 있다. 대상이 이미 사라질 수 있으므로 접근할 때 None을 처리한다. 모든 내장 타입이 약한 참조를 지원하는 것은 아니다.
메모리 사용은 `tracemalloc`로 할당 위치를 비교하고, 객체 크기 하나의 `sys.getsizeof`만 합산해 전체 사용량이라고 단정하지 않는다. 그 값은 보통 참조 대상의 크기를 포함하지 않는다.
댓글
0개아직 댓글이 없습니다.