[파이썬] 메모리 누수와 약한 참조에 대한 나름의 이해

2023. 10. 9. 12:48파이썬

파이썬에서도 메모리 누수가 발생할 수 있다.

예를 들어, 객체의 필드가 다른 객체를 참고하는 서로 참고 하는 경우 del을 해도 제거되지 않는다.

gc가 실행되는 건 참조수가 0이어야지만 가능한데 위의 경우는 참조수가 0이 되지 않기 때문이다.

이를 해결하기 위해 약한 참조를 사용한다. 약한 참조는 참조를 하더라도 참조수를 올리지 않는다.

이러한 약한 참조는 순환 참조에 유용하다.

결국 파이썬에서 메모리 누수나 gc등의 문제를 고려하기 위해서는 참조수가 제일 중요하다!!(기본 원리이기 때문이다)

 

 

또한 아래와 같은 상황에서 foo()를 호출하게 되면 메모리 누수가 발생할 수 있다. 왜냐하면 파라미터 a의 디폴트가 []인데 여기에 계속 값이 쌓이는 형태로 바뀌기 때문이다. 예를 들어, a[xx, xx] 이런 식으로 말이다. 이건 원치 않는 결과이므로 기본 인자를 None으로 주어야 한다.

def foo(a=[]):
    a.append(time.time())
    return a

아래와 같이 말이다.

def foo(a=None):
    if a is None:
        a = []
    a.append(time.time())
    return a

 

Reference


https://soooprmx.com/%ed%8c%8c%ec%9d%b4%ec%8d%ac-%ec%95%bd%ed%95%9c%ec%b0%b8%ec%a1%b0/

 

(파이썬) 약한 참조 사용하기 · Wireframe

파이썬과 C를 비교하면서 차이점을 이야기하는 사람 중에는 “파이썬은 별도의 메모리 관리가 필요없다”는 이야기를 하는 사람들이 있다. 실제로 프로그램이 실행되는 동안 객체를 위한 메모

soooprmx.com