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