Я работаю над решением утечки памяти в моем приложении Python.
Вот вещь - это действительно только, кажется, происходит на Windows Server 2008 (не R2), но не более ранние версии Windows, и также не похоже, что это происходит на Linux (хотя я не сделал почти такого же тестирования на Linux).
Для поиска и устранения неисправностей его я настроил отладку на сборщике "мусора":
gc.set_debug(gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_INSTANCES | gc.DEBUG_OBJECTS)
Затем периодически, я регистрирую содержание gc.garbage.
Вещь, gc.garbage всегда пуст, все же мое использование памяти повышается и и.
Очень озадачивающий.
Если в gc.garbage никогда не бывает мусора, то я не уверен, что вы пытаетесь сделать, включив отладку GC. Конечно, он скажет вам, какие объекты рассматриваются для очистки, но это не особенно интересно, если у вас не останется циклических ссылок, которые нельзя очистить.
Если ваша программа использует все больше и больше памяти в зависимости от ОС, обычно может быть четыре различных случая:
gc
(обычно потому, что один из них имеет метод __ del __
). Судя по вашему описанию, он вряд ли будет №1 (поскольку он будет вести себя одинаково в любой ОС) и, по-видимому, не №2 (поскольку в gc.garbage ничего нет.Учитывая № 3, Windows (в целом) имеет распределитель памяти, который, как известно, плохо работает с фрагментированными выделениями, но Python работает над этим с помощью своего внешнего интерфейса obmalloc
для malloc ()
. Тем не менее, это может быть проблема, специфичная для системных библиотек Windows Server 2008, из-за которой кажется, что ваше приложение использует все больше и больше памяти. Или это может быть случай №4, модуль расширения C / C ++ или DLL, используемая Python или модулем расширения, с утечкой памяти.
В общем, первый виновник утечек памяти в Python находится в расширениях C .
Вы используете какие-либо из них?
Кроме того, вы говорите, что проблема возникает только в 2008 году; Затем я проверял расширения на предмет несовместимости, потому что в Vista и 2008 было довольно много мелких изменений, которые вызвали проблемы в этой области.
Как вариант, попробуйте запустить приложение в режиме совместимости с Windows, выбрав Windows XP - это может помочь решить проблему, особенно если она связана с изменениями в системе безопасности.