2014-11-12 4 views
1

현재 Python 프로그램에서 메모리 누수를 디버깅하고 있습니다. 어떤 객체도 __del__ 메소드를 가지고 있지 않기 때문에 문제는 도달 가능한 객체에 대한 참조를 계속 누적하는 일종의 전역 변수라고 가정합니다. 또한 gc.debug(gc.DEBUG_LEAK)을 사용하여 실행하면 gc: collectable 개의 메시지가 많이 표시되지만 gc: uncollectable 개의 메시지는 표시되지 않습니다. 이 의심을 확인하기 위해 프로그램에서 도달 할 수있는 객체의 총 개수를 어떻게 든 얻고 싶습니다. 그래서 꾸준히 증가하고 있음을 확인할 수 있습니다.도달 할 수있는 활성 객체 수 얻기

이 방법이 있습니까? 나는 gc.get_count을보고 있었지만 이것은 나에게 아직도 도달 할 수있는 살아있는 객체의 수 라기보다는 실제로 수집 된 객체의 수 (세대로 구분)를 제공하는 것으로 보인다.

답변

1

gc.get_objects은 원하는 것 같습니다. DEBUG_LEAKDEBUG_SAVEALL을 의미하므로주의하십시오. DEDUG_SAVEALL은 모든 참조되지 않은 오브젝트가 해제되지 않고 gc.garbage에 저장되도록합니다. 즉, 가비지 컬렉터가 추적하는 오브젝트 수는 증가 할 수 있습니다. 또한 gc.get_objects은 가비지 수집기에서 추적하지 않는 일부 유형 (원자 유형은 추적되지 않음)이므로 현재 라이브 객체를 모두 반환하지 않습니다. 예를 들어 [i for i in range(1000)]은 가비지 수집기에서 정수를 추적하지 않으므로 하나가 추적하는 객체 만 늘립니다. 반면 [[] for i in range(1000)]은 추적되는 개체 수를 1001 개로 늘립니다.

관련 문제