2011-07-01 5 views
7

나는 장시간 실행되는 대형 서버를 가지고 있으며, 몇 주 동안 메모리 사용이 꾸준히 증가했다.파이썬에서 수집 할 수없는 가비지를 만드는 방법은 무엇입니까?

일반적으로 아래에 지적했듯이 누수가 내 문제 일 가능성은 거의 없습니다. 그러나, 나는 누출이 있는지보고 싶기 때문에 계속할 일이별로 없습니다.

콘솔 출력을 얻는 것이 까다로 우며 gc.set_debug()으로 실행되지 않습니다. 이것은 큰 문제는 아니지만, 쉽게 API를 추가하여 gc.collect()을 실행 한 다음 gc.garbage을 반복하고 HTTP를 통해 나에게 결과를 보냅니다.

내 문제는 로컬 시간 내 짧은 시간 내 gc.garbage 항상 비어 있습니다. 배포하기 전에 누수를 나열하는 코드를 테스트 할 수 없습니다.

쓰레기를 나열하는 코드를 테스트 할 수 있도록 수집 할 수없는 쓰레기를 만드는 간단한 방법이 있습니까?

+0

Giovanni Bajo는 지난 달 EuroPython에서 메모리 누수를 디버깅하는 데 관한 훌륭한 토론을했습니다. 토크 비디오는 여기에 있습니다 : http://ep2011.europython.eu/conference/talks/debugging-and-profiling-techniques – grifaton

+0

적어도 하나의 씨앗이 필요합니다 :( – Will

답변

12

종료 가능한 객체 (즉, 인 __del__ 방법 객체) (가비지 수집기에서 종료자를 실행하려면 어떤 순서로 모르기 때문에) 회수 불가 인의 모든주기 :

>>> class Finalizable: 
...  def __del__(self): pass 
... 
>>> a = Finalizable() 
>>> b = Finalizable() 
>>> a.x = b 
>>> b.x = a 
>>> del a 
>>> del b 
>>> import gc 
>>> gc.collect() 
4 
>>> gc.garbage 
[<__main__.Finalizable instance at 0x1004e0b48>, 
<__main__.Finalizable instance at 0x1004e73f8>] 

를하지만 일반 지점으로 , 당신 finalizer를 사용하는 습관에 있지 않는 한 귀하의 문제는 수집 할 수없는 쓰레기로 인한 것 같지 않습니다. 라이브 오브젝트의 축적이나 메모리 조각화 (파이썬이 움직이지 않는 콜렉터를 사용하기 때문에) 때문에 가능성이 더 큽니다.

+0

실례 합니다만 볼 수 있도록 쓰레기를 만들려고합니다. 파이썬에서 어떻게 작동하는지 위 예제에서 a와 b가 참조를 삭제하기 전에 가비지 란 무엇인가요? http://www.pythontutor.com/visualize.html#code=class+Finalizable%3A% 0A ++++ def + __ del __ (자아) % 3A + 패스 % 0A % 0Aa + % 3D + Finalizable() % 0Ab + % 3D + Finalizable() % 0Aa.x + % 3D + b % 0Ab.x + % 3D + a % – BugShotGG

+2

자신을 참조하십시오 : 삭제하기 전에'id (a)'와'id (b)'를 출력하고 if()를 참조하십시오 : ifAll 이 ID들은 콜렉션 후에'id (gc.garbage [0])'와'id (gc.garbage [1])'와 일치합니다 –

+0

그게 효과가 있습니다! 건배! – BugShotGG

관련 문제