#python #memory
Вопрос:
Есть ли способ получить доступ к куче памяти в Python? Меня интересует возможность доступа ко всем объектам, выделенным в памяти запущенного экземпляра.
Комментарии:
1. Если я не ошибаюсь и не неправильно понимаю вопрос, вы можете сделать
globals()
2. @Sujay: Это показывает вам только то, что видно в глобальном масштабе в текущем модуле. Добавление
locals()
также позволит вам просмотреть локальные области в заданной области функций, но даже в этом случае вы не увидите области замыкания/класса/экземпляра, а также переменные, выделенные в других локальных областях или в глобальных других модулях.3. Дело в том, что «куча» является общим хранилищем для каждого динамически выделяемого объекта во всей программе (в CPython сам стек C не хранит почти ничего интересного для наблюдателя; сам стек вызовов уровня Python также выделяется в куче), это не просто несколько вещей, непосредственно видимых в области LEGB в любой данный момент времени.
Ответ №1:
Вы не можете получить прямой доступ, но gc
модуль должен делать большую часть того, что вы хотите. Простой gc.get_objects()
вызов вернет все объекты, отслеживаемые сборщиком. Это не все, поскольку с CPython сборщик мусора занимается только с потенциальными ссылочные циклы (так что встроенные типы, которые не могут ссылаться на другие объекты, например int
, float
, str
, и т. д.) не появляются в результате list
, но все они будут ссылаться на то , что list
(если бы они не были, их счетчик ссылок будет равен нулю и они были утилизированы).
Кроме того, вы можете получить более целенаправленное использование inspect
модуля, особенно проверку кадров стека, используя traceback
модуль для «простого форматирования» или вручную копаясь в самих полудокументированных объектах кадра, что позволит вам сузить область действия до определенной активной области в кадре стека.
Для решения, наиболее близкого к куче, вы можете использовать tracemalloc
модуль для отслеживания и записи распределений по мере их возникновения, или pdb
отладчик для самоанализа извне (возможно, добавляя breakpoint()
вызовы в ваш код, чтобы он автоматически останавливался, когда вы достигнете этой точки, чтобы вы могли осмотреться).