Сообщить об ошибке.

Функция getobjects() модуля sys в Python

Отслеживание утечек памяти или поведения сборщика мусора

Синтаксис:

import sys

sys.getobjects(limit[, type])

Параметры:

  • limit - (int) - максимальное количество объектов, которое будет возвращено.
  • type - (класс, например list, dict, str) - если указан, в результат включаются только объекты, тип которых совпадает точно с указанным.

Возвращаемое значение:

  • Возвращает список до limit динамически выделенных объектов Python. Если указан параметр type, включаются только объекты указанного типа, в точности (подтипы не включаются).

Описание:

Функция getobjects() модуля sys существует только в том случае, если CPython был собран с использованием специального параметра --with-trace-refs. Она предназначена исключительно для отладки проблем со сборкой мусора.

Объекты из возвращённого списка небезопасно использовать. В частности, результат может включать объекты из всех интерпретаторов, которые разделяют состояние выделителя памяти (то есть интерпретаторов, созданных с PyInterpreterConfig.use_main_obmalloc, установленным в 1, или с помощью Py_NewInterpreter(), а также основного интерпретатора). Использование объектов из разных интерпретаторов может привести к краху программы или непредсказуемому поведению.

Деталь реализации CPython: Эта функция должна использоваться только для узкоспециализированных задач. Её наличие не гарантируется во всех реализациях Python.

Изменено в Python 3.14: Результат может включать объекты из других интерпретаторов.

Пояснение для sys.getobjects()

  • Функция не включена по умолчанию. Она доступна только при сборке CPython с --with-trace-refs.
  • Назначение - внутренняя отладка, например, отслеживание утечек памяти или поведения сборщика мусора.
  • Не предназначена для использования в прикладных программах.
  • Возвращает список объектов, которые существуют в памяти (включая временные, недоступные из Python-кода).
  • Параметр type - это тип (класс), например list, dict, str. Учитываются только объекты этого типа, не включая подклассы.
  • Начиная с Python 3.14, список может содержать объекты из других изолированных подинтерпретаторов (из тех, что используют общий выделитель памяти). Это новое поведение по сравнению с более ранними версиями.
  • Работа с объектами из результата (например, вызов методов, доступ к атрибутам) может вызвать сбой, особенно если объект принадлежит другому интерпретатору.

Важные ограничения

  1. Функция может отсутствовать. Это нормально, если Python собран без --with-trace-refs. Как проверить наличие:

    import sys
    
    if hasattr(sys, 'getobjects'):
       # Получить до 3 объектов типа dict
        dicts = sys.getobjects(3, dict)
        print(dicts)
    else:
        print("sys.getobjects недоступна")
    

    Примечание: в стандартных дистрибутивах Python (например: Ubuntu, Debian) --with-trace-refs обычно не используется. Эта опция - для разработчиков CPython.

  2. Нельзя полагаться на результат в продакшене - только для отладки.

  3. Не используйте объекты из результата для реальной работы - они могут быть из другого интерпретатора, и доступ к ним опасен.

  4. Не гарантируется порядок или полнота списка - он содержит лишь часть объектов на момент вызова.

Пример использования (только если --with-trace-refs включён)

import sys

# Проверяем, существует ли функция
if not hasattr(sys, 'getobjects'):
    print("Ошибка: sys.getobjects недоступна. Python собран без --with-trace-refs")
else:
    # Получить до 5 объектов любого типа
    objects = sys.getobjects(5)
    print(f"Найдено объектов: {len(objects)}")
    for obj in objects:
        print(type(obj), repr(obj))

    # Получить до 3 объектов типа list
    lists = sys.getobjects(3, list)
    print(f"Списков найдено: {len(lists)}")
    for lst in lists:
        print(f"  Список: {lst}")