컴퓨터/밑딥3

[밑바닥부터 시작하는 딥러닝3] 메모리 관리

xeskin 2020. 12. 13. 17:38
반응형

17. 메모리 관리와 순환 참조

17.1 메모리 관리

  • 파이썬은 불필요한 객체를 인터프리터가 제거해준다.

  • 코드를 제대로 작성하지 않은 경우 '메모리 누수'나 '메모리 부족'등의 문제가 발생할 수 있다.

  • 파이썬은 두 가지 방식으로 메모리를 관리한다.

    1. 참조 카운트 방식의 메모리 관리

      • 모든 객체는 참조 카운트가 0인 상태로 생성

      • 다른 객체가 참조할 때마다 1씩 증가, 참조가 끊길 때마다 1만큼 감소, 0이 되면 파이썬 인터프리터가 회수

        참조 카운트가 증가하는 경우

        1. 대입 연산자 사용할 때
        2. 함수의 인수로 전달할 때
        3. 컨테이너 타입 객체(리스트, 튜플, 클래스 등)에 추가할 때
      • 참조 카운트 방식은 '순환 참조'를 해결할 수 없음
        -> Garbage Collection으로 해결한다.

        # 순환 참조의 예시
        a = obj()
        b = obj()
        c = obj()
        
        a.b = b
        b.c = c
        c.a = a
        
        a = b = c = None
    2. Garbage Collection (GC) - 세대를 기준으로 쓸모 없어진 객체를 회수하는 방식

      • 참조 카운트와 달리 메모리가 부족해지는 시점에 파이썬 인터프리터에 의해 자동으로 호출됨 (명시적으로도 호출 가능)
      • GC는 순환 참조를 잘 처리하지만, 일반적인 파이썬 프로그래밍에서는 이를 의식하지 않아 메모리 해제를 GC에 미루다보면 전체 메모리 사용량이 커지는 원인이 된다.
      • 현재, Function 인스턴스와 Variable 인스턴스가 순환 참조 관계를 만든다.
        -> 표준 파이썬 모듈인 weakref로 해결할 수 있음
        • weakref.ref()를 사용하면 약한 참조를 만들 수 있다.
          약한 참조: 다른 객체를 참조하되 참조 카운트를 증가시키지 않는 기능
반응형