반응형
17. 메모리 관리와 순환 참조
17.1 메모리 관리
파이썬은 불필요한 객체를 인터프리터가 제거해준다.
코드를 제대로 작성하지 않은 경우 '메모리 누수'나 '메모리 부족'등의 문제가 발생할 수 있다.
파이썬은 두 가지 방식으로 메모리를 관리한다.
참조 카운트 방식의 메모리 관리
모든 객체는 참조 카운트가 0인 상태로 생성
다른 객체가 참조할 때마다 1씩 증가, 참조가 끊길 때마다 1만큼 감소, 0이 되면 파이썬 인터프리터가 회수
참조 카운트가 증가하는 경우
- 대입 연산자 사용할 때
- 함수의 인수로 전달할 때
- 컨테이너 타입 객체(리스트, 튜플, 클래스 등)에 추가할 때
참조 카운트 방식은 '순환 참조'를 해결할 수 없음
-> Garbage Collection으로 해결한다.# 순환 참조의 예시 a = obj() b = obj() c = obj() a.b = b b.c = c c.a = a a = b = c = None
Garbage Collection (GC) - 세대를 기준으로 쓸모 없어진 객체를 회수하는 방식
- 참조 카운트와 달리 메모리가 부족해지는 시점에 파이썬 인터프리터에 의해 자동으로 호출됨 (명시적으로도 호출 가능)
- GC는 순환 참조를 잘 처리하지만, 일반적인 파이썬 프로그래밍에서는 이를 의식하지 않아 메모리 해제를 GC에 미루다보면 전체 메모리 사용량이 커지는 원인이 된다.
- 현재, Function 인스턴스와 Variable 인스턴스가 순환 참조 관계를 만든다.
-> 표준 파이썬 모듈인 weakref로 해결할 수 있음- weakref.ref()를 사용하면 약한 참조를 만들 수 있다.
약한 참조: 다른 객체를 참조하되 참조 카운트를 증가시키지 않는 기능
- weakref.ref()를 사용하면 약한 참조를 만들 수 있다.
반응형
'컴퓨터 > 밑딥3' 카테고리의 다른 글
[밑바닥부터 시작하는 딥러닝3] 딥러닝 프레임워크의 동작 방식 (0) | 2020.12.18 |
---|---|
[밑바닥부터 시작하는 딥러닝3] 연산자 오버로드 (0) | 2020.12.14 |