Python - утечка памяти - PullRequest
       6

Python - утечка памяти

8 голосов
/ 21 апреля 2010

Я работаю над устранением утечки памяти в моем приложении Python.

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

Для устранения неполадок я настроил отладку на сборщике мусора:

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

Затем периодически регистрирую содержимое gc.garbage.

Дело в том, что gc.garbage всегда пуст, но мое использование памяти все возрастает.

Очень загадочно.

Ответы [ 3 ]

25 голосов
/ 21 апреля 2010

Если в 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 голосов
/ 21 апреля 2010

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

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

2 голосов
/ 02 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...