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

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

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

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

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

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

Вещь, gc.garbage всегда пуст, все же мое использование памяти повышается и и.

Очень озадачивающий.

8
задан Dave 20 April 2010 в 21:47
поделиться

2 ответа

Если в 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 или модулем расширения, с утечкой памяти.

25
ответ дан 5 December 2019 в 05:55
поделиться

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

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

3
ответ дан 5 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: