2010-04-20 3 views
8

Я работаю над решением проблемы утечки памяти в моем приложении Python.Python - Memory Leak

Вот что - на самом деле это происходит только на Windows Server 2008 (а не на R2), но не на более ранних версиях Windows, и это также не похоже на то, что это происходит в Linux (хотя я не делал почти как много тестирования на Linux).

Чтобы устранить его, настроить отладку на сборщик мусора:

gc.set_debug(gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_INSTANCES | gc.DEBUG_OBJECTS) 

Затем, периодически, я вхожу содержимое gc.garbage.

Thing is, gc.garbage всегда пуст, но использование моей памяти растет вверх и вверх.

Очень озадачивает.

+9

Dave, очевидно, ваша проблема может быть устранена путем удаления строки 123 .... и добавьте i = 1 в строку 27 ... –

+0

серьезно, я думаю, что вам понадобится код. –

+1

Полу-дубликат (или может быть интересной нитью для чтения): http://stackoverflow.com/questions/1435415/python-memory-leaks/1435426#1435426 (если это не удается, вернитесь с подробной информацией) – ChristopheD

ответ

2

Лучше поздно, чем никогда. Решила это довольно быстро, но забыла опубликовать ответ. Мы закончили тем, что выкрутили код Twisted и использовали CherryPy.Это намного легче, проще в использовании, и это больше не происходит. Вполне вероятно, что это была наша вина, что это происходило, и NOT Twisted's, но код был настолько плохим, что мы просто решили переписать это было бы проще всего.

+0

это не ответ –

26

Если в gc.garbage никогда не было мусора, то я не уверен, что вы пытаетесь сделать, включив GC-отладку. Конечно, он расскажет вам, какие объекты рассматриваются для очистки, но это не особенно интересно, если вы не получите никаких круговых ссылок, которые невозможно очистить.

Если ваша программа использует все больше и больше памяти в зависимости от ОС, может вообще быть четыре различных случая в игре:

  1. Ваше приложение хранит все больше и больше вещей, сохраняя ссылки на каждой из них, таким образом они не собирайте.
  2. Вашего приложение создает циклические ссылки между объектами, которые не могут быть очищены с помощью модуля gc (как правило, потому что один из них имеют метод __del__.)
  3. Вашего приложения освобождает (и повторное использование) память, но ОС не хочет, чтобы память повторно использовалась, поэтому она продолжает выделять новые блоки памяти.
  4. Утечка - настоящая утечка памяти, но в модуле расширения C/C++, который использует ваш код.

Из вашего описания, это звучит, как это вряд ли будет # 1 (как это будет вести себя так же на любой ОС) и, по-видимому, не # 2 либо (так как нет ничего в gc.garbage.) Учитывая, # 3, Windows (в общем случае) имеет распределитель памяти, который, как известно, плох с фрагментированными выделениями, но Python работает со своим obmalloc интерфейсом для malloc(). Это все еще может быть проблемой в системных библиотеках Windows Server 2008, которые делают его похожим на то, что ваше приложение использует все больше и больше памяти. Или это может быть случай # 4, модуль расширения C/C++ или DLL, используемый Python или модулем расширения, с утечкой памяти.

3

В целом, первый виновник утечек памяти в python находится в C расширениях.
Вы используете любой из них?

Кроме того, вы говорите, что проблема возникает только в 2008 году; Затем я бы проверял расширения на предмет какой-либо несовместимости, потому что с Vista и 2008 было довольно много небольших изменений, которые вызвали проблемы в этой области.
Как и альтернатива, попробуйте выполнить свое приложение в режиме совместимости Windows, выбрав Windows XP - это может помочь в решении проблемы, особенно если это связано с изменениями безопасности.