Как создать неслыханный мусор в Python? - PullRequest
7 голосов
/ 01 июля 2011

У меня большой долго работающий сервер, и в течение нескольких недель использование памяти неуклонно растет.

Как правило, как указано ниже, маловероятно, что утечки являются моей проблемой; тем не менее, у меня не так много работы, поэтому я хочу посмотреть, есть ли утечки.

Получить на консоль вывод сложно, поэтому я не работаю с gc.set_debug(). Это не большая проблема, так как я легко добавил API, чтобы заставить его запускать gc.collect(), а затем перебрать gc.garbage и отправить результаты обратно мне по HTTP.

Моя проблема в том, что при локальном запуске в течение короткого времени мой gc.garbage всегда пуст. Я не могу проверить свой фрагмент кода, который перечисляет утечки, прежде чем я его разверну.

Существует ли тривиальный рецепт для создания необратимого мусора, чтобы я мог протестировать свой код, который перечисляет мусор?

1 Ответ

12 голосов
/ 01 июля 2011

Любой цикл финализуемых объектов (то есть объектов с методом __del__) не может быть собран (поскольку сборщик мусора не знает, в каком порядке запускать финализаторы):

>>> class Finalizable:
...     def __del__(self): pass
...
>>> a = Finalizable()
>>> b = Finalizable()
>>> a.x = b
>>> b.x = a
>>> del a
>>> del b
>>> import gc
>>> gc.collect()
4
>>> gc.garbage
[<__main__.Finalizable instance at 0x1004e0b48>,
 <__main__.Finalizable instance at 0x1004e73f8>]

Но в целом мне кажется маловероятным, что ваша проблема связана с несобираемым мусором, если только вы не привыкли использовать финализаторы. Скорее всего, это связано с накоплением живых объектов или фрагментацией памяти (поскольку Python использует неподвижный коллектор).

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