SlideShare uma empresa Scribd logo
1 de 41
Baixar para ler offline
Garbage collector
and a bit of memory
management
Cyril @notorca Lashkevich

piątek, 27 września 13
Модели управления
памятью
• Вручную
• Подсчет ссылок
• Garbage Collector

piątek, 27 września 13
Ручное управление

piątek, 27 września 13
Ручное управление
• Переменные на
стеке

piątek, 27 września 13
Ручное управление
• Переменные на
стеке

• alloca

piątek, 27 września 13
Ручное управление
• Переменные на
стеке

• alloca
• Масивы переменной
длинны (C99)

piątek, 27 września 13
Ручное управление
• Переменные на
стеке

• alloca
• Масивы переменной
длинны (C99)

• malloc/free
piątek, 27 września 13
Подсчет ссылок

piątek, 27 września 13
Подсчет ссылок
• retain(INCREF)/

release(DECREF)

piątek, 27 września 13
Подсчет ссылок
• retain(INCREF)/

release(DECREF)

• autoreleasepool

piątek, 27 września 13
Подсчет ссылок
• retain(INCREF)/

release(DECREF)

• autoreleasepool
• weak
piątek, 27 września 13
DAG
(directed acyclic graph)

• Задача

программиста не
допускать циклов в
графе объектов

piątek, 27 września 13
DAG
(directed acyclic graph)

• Задача

программиста не
допускать циклов в
графе объектов

piątek, 27 września 13
DAG
(directed acyclic graph)

• Задача

программиста не
допускать циклов в
графе объектов

piątek, 27 września 13
Что делать если циклы
нужны?

piątek, 27 września 13
Что делать если циклы
нужны?
• Пример: граф с
циклами

piątek, 27 września 13
Что делать если циклы
нужны?
• Пример: граф с
циклами

• Приходится

устранять циклы
вручную

piątek, 27 września 13
Что делать если циклы
нужны?
• Пример: граф с
циклами

• Приходится

устранять циклы
вручную

piątek, 27 września 13
Что делать если циклы
нужны?
• Пример: граф с
циклами

• Приходится

устранять циклы
вручную

piątek, 27 września 13
Что делать если циклы
нужны?
• Пример: граф с
циклами

• Приходится

устранять циклы
вручную

piątek, 27 września 13
Weak-ссылки
• Не увеличивают
счетчик ссылок
объекта

• Автоматически

зануляются при
уничтожении
объекта

piątek, 27 września 13
Python sys.getrefcount()
import sys
one = []
print 'At start
:',
sys.getrefcount(one)
two = one
print 'Second reference :',
sys.getrefcount(one)
del two
print 'After del
:',
sys.getrefcount(one)

piątek, 27 września 13
Python sys.getrefcount()
import sys
one = []
print 'At start
:',
sys.getrefcount(one)
two = one
print 'Second reference :',
sys.getrefcount(one)
del two
print 'After del
:',
sys.getrefcount(one)

piątek, 27 września 13

At start
: 2
Second reference : 3
After del
: 2
Анализ графа объектов
• Функции для анализа в модуле gc
• gc.get_referrers(*objs)
• gc.get_referents(*objs)
• Native-объекты должны предоставлять метод
tp_traverse

piątek, 27 września 13
Модуль weakref
• Слабые ссылки с callback на удаление объекта
• Proxy-объекты бросающие исключение при

использовании удаленного объекта (not hashable!)

• WeakValue и WeakKey словари
• WeakSet (3.2)
piątek, 27 września 13
In [11]: obj = ExpensiveObject()
In [12]: r = weakref.ref(obj)
In [15]: print('obj:', obj)
obj: <__main__.ExpensiveObject object at 0x108ea24d0>
In [16]: print('ref:', r)
ref: <weakref at 0x108eb62b8; to 'ExpensiveObject' at
0x108ea24d0>
In [17]: print('r():', r())
r(): <__main__.ExpensiveObject object at 0x108ea24d0>
In [18]: del obj
Deleting Expencive object
In [19]: print('r():', r())
r(): None
piątek, 27 września 13
Ограничения
• Не все типы могут быть weak: string, list,
tuple...

• Native-объекты должны реализовывать

поддержку (через tp_weaklistoffset )

• Осторожно с weak словарями!
piątek, 27 września 13
Garbage Collector
• Удаляет объекты,

недостижимые по
ссылкам из
корневого объекта
но с ненулевым
счетчиком ссылок

piątek, 27 września 13
GC в python
• Запускается когда колличество созданых

объектов поколения превышает количество
удаленных на х (по умолчанию 700, 10, 10)

• Либо вручную gc.collect()
• Low memory, idle не инициируют сборку
мусора

• Может работать долго
piątek, 27 września 13
Generations and thresholds

piątek, 27 września 13
Generations and thresholds
• 3 "поколения" (списка) объектов: 0,

piątek, 27 września 13

1, 2
Generations and thresholds
• 3 "поколения" (списка) объектов: 0, 1,
• Новые объекты попадают в 0 (не все)

piątek, 27 września 13

2
Generations and thresholds
• 3 "поколения" (списка) объектов: 0, 1,
• Новые объекты попадают в 0 (не все)
• Сборка мусора работает по поколениям

piątek, 27 września 13

2
Generations and thresholds
• 3 "поколения" (списка) объектов: 0, 1,
• Новые объекты попадают в 0 (не все)
• Сборка мусора работает по поколениям
• Объекты пережившие сборку мусора
переносятся в поколение +1

piątek, 27 września 13

2
Generations and thresholds
• 3 "поколения" (списка) объектов: 0, 1,
• Новые объекты попадают в 0 (не все)
• Сборка мусора работает по поколениям
• Объекты пережившие сборку мусора

2

переносятся в поколение +1

• Поколение 1 проверяется после threshold1
обработок поколения 0

piątek, 27 września 13
Ограничения GC
• Объекты с определенным __del__ не
уничтожаются GC (он не знает в каком
порядке их вызвать)

• Native-объекты которые могут содержать
ссылки должны правильно реализовывать
tp_traverse

piątek, 27 września 13
Проблемы с __del__
• Может создать циклические ссылки с

sys.exc_traceback и
sys.last_traceback (их нужно явно
занулить)

• Исключения в __del__ игнорируются с
выводом сообщения на stderr

• Не вызывается при завершении программы
piątek, 27 września 13
Удаление неудаляемых
объектов
• Вызвать gc.collect() что бы явно

запустить сборку мусора (вернет количество
удаленных объектов

• В gc.garbage список объектов с

циклическими ссылками и __del__.
Проходим по этому списку и разрываем
циклические ссылки. (gc.get_referrers)

• del
piątek, 27 września 13

gc.garbage[:]
Отладка
• gc.DEBUG_LEAK, gc.DEBUG_*
• Heapy (http://guppy-pe.sourceforge.net/)
• Meliae (https://launchpad.net/meliae)
• gdb-heap (https://fedorahosted.org/gdb-heap/)
piątek, 27 września 13
Альтернативы
• PyPy
• Отключить GC вообще и следить за деревом
объектов вручную

• Отключить но вызывать gc.collect() в
правильные моменты времени

piątek, 27 września 13
Спасибо
piątek, 27 września 13

Mais conteúdo relacionado

Semelhante a Garbage collector and a bit of memory management

Нетрадиционное использование Ruby и PostgreSQL
Нетрадиционное использование Ruby и PostgreSQLНетрадиционное использование Ruby и PostgreSQL
Нетрадиционное использование Ruby и PostgreSQLIvan Evtukhovich
 
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)Ontico
 
Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)Ontico
 
React со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингReact со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингTimophy Chaptykov
 
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...CodeFest
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_drupalconf
 
Сергей Бережной — Парное программирование
Сергей Бережной — Парное программированиеСергей Бережной — Парное программирование
Сергей Бережной — Парное программированиеYandex
 

Semelhante a Garbage collector and a bit of memory management (8)

Нетрадиционное использование Ruby и PostgreSQL
Нетрадиционное использование Ruby и PostgreSQLНетрадиционное использование Ruby и PostgreSQL
Нетрадиционное использование Ruby и PostgreSQL
 
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
 
Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
 
React со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингReact со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендеринг
 
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
 
Сергей Бережной — Парное программирование
Сергей Бережной — Парное программированиеСергей Бережной — Парное программирование
Сергей Бережной — Парное программирование
 
Going to extreme
Going to extremeGoing to extreme
Going to extreme
 

Mais de Python Meetup

Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Python Meetup
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Python Meetup
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python Meetup
 
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 Practical Python Packaging / Стас Рудаков / Web Developer Wargaming Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Practical Python Packaging / Стас Рудаков / Web Developer WargamingPython Meetup
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython Meetup
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Python Meetup
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...Python Meetup
 
Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingPython Meetup
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014Python Meetup
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Python Meetup
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GOPython Meetup
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюPython Meetup
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка TwistedPython Meetup
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Python Meetup
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данныхPython Meetup
 

Mais de Python Meetup (20)

Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
 
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 Practical Python Packaging / Стас Рудаков / Web Developer Wargaming Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
 
Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer Wargaming
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GO
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностью
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка Twisted
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне
 
Pebble
PebblePebble
Pebble
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данных
 

Garbage collector and a bit of memory management

  • 1. Garbage collector and a bit of memory management Cyril @notorca Lashkevich piątek, 27 września 13
  • 2. Модели управления памятью • Вручную • Подсчет ссылок • Garbage Collector piątek, 27 września 13
  • 4. Ручное управление • Переменные на стеке piątek, 27 września 13
  • 5. Ручное управление • Переменные на стеке • alloca piątek, 27 września 13
  • 6. Ручное управление • Переменные на стеке • alloca • Масивы переменной длинны (C99) piątek, 27 września 13
  • 7. Ручное управление • Переменные на стеке • alloca • Масивы переменной длинны (C99) • malloc/free piątek, 27 września 13
  • 11. Подсчет ссылок • retain(INCREF)/ release(DECREF) • autoreleasepool • weak piątek, 27 września 13
  • 12. DAG (directed acyclic graph) • Задача программиста не допускать циклов в графе объектов piątek, 27 września 13
  • 13. DAG (directed acyclic graph) • Задача программиста не допускать циклов в графе объектов piątek, 27 września 13
  • 14. DAG (directed acyclic graph) • Задача программиста не допускать циклов в графе объектов piątek, 27 września 13
  • 15. Что делать если циклы нужны? piątek, 27 września 13
  • 16. Что делать если циклы нужны? • Пример: граф с циклами piątek, 27 września 13
  • 17. Что делать если циклы нужны? • Пример: граф с циклами • Приходится устранять циклы вручную piątek, 27 września 13
  • 18. Что делать если циклы нужны? • Пример: граф с циклами • Приходится устранять циклы вручную piątek, 27 września 13
  • 19. Что делать если циклы нужны? • Пример: граф с циклами • Приходится устранять циклы вручную piątek, 27 września 13
  • 20. Что делать если циклы нужны? • Пример: граф с циклами • Приходится устранять циклы вручную piątek, 27 września 13
  • 21. Weak-ссылки • Не увеличивают счетчик ссылок объекта • Автоматически зануляются при уничтожении объекта piątek, 27 września 13
  • 22. Python sys.getrefcount() import sys one = [] print 'At start :', sys.getrefcount(one) two = one print 'Second reference :', sys.getrefcount(one) del two print 'After del :', sys.getrefcount(one) piątek, 27 września 13
  • 23. Python sys.getrefcount() import sys one = [] print 'At start :', sys.getrefcount(one) two = one print 'Second reference :', sys.getrefcount(one) del two print 'After del :', sys.getrefcount(one) piątek, 27 września 13 At start : 2 Second reference : 3 After del : 2
  • 24. Анализ графа объектов • Функции для анализа в модуле gc • gc.get_referrers(*objs) • gc.get_referents(*objs) • Native-объекты должны предоставлять метод tp_traverse piątek, 27 września 13
  • 25. Модуль weakref • Слабые ссылки с callback на удаление объекта • Proxy-объекты бросающие исключение при использовании удаленного объекта (not hashable!) • WeakValue и WeakKey словари • WeakSet (3.2) piątek, 27 września 13
  • 26. In [11]: obj = ExpensiveObject() In [12]: r = weakref.ref(obj) In [15]: print('obj:', obj) obj: <__main__.ExpensiveObject object at 0x108ea24d0> In [16]: print('ref:', r) ref: <weakref at 0x108eb62b8; to 'ExpensiveObject' at 0x108ea24d0> In [17]: print('r():', r()) r(): <__main__.ExpensiveObject object at 0x108ea24d0> In [18]: del obj Deleting Expencive object In [19]: print('r():', r()) r(): None piątek, 27 września 13
  • 27. Ограничения • Не все типы могут быть weak: string, list, tuple... • Native-объекты должны реализовывать поддержку (через tp_weaklistoffset ) • Осторожно с weak словарями! piątek, 27 września 13
  • 28. Garbage Collector • Удаляет объекты, недостижимые по ссылкам из корневого объекта но с ненулевым счетчиком ссылок piątek, 27 września 13
  • 29. GC в python • Запускается когда колличество созданых объектов поколения превышает количество удаленных на х (по умолчанию 700, 10, 10) • Либо вручную gc.collect() • Low memory, idle не инициируют сборку мусора • Может работать долго piątek, 27 września 13
  • 31. Generations and thresholds • 3 "поколения" (списка) объектов: 0, piątek, 27 września 13 1, 2
  • 32. Generations and thresholds • 3 "поколения" (списка) объектов: 0, 1, • Новые объекты попадают в 0 (не все) piątek, 27 września 13 2
  • 33. Generations and thresholds • 3 "поколения" (списка) объектов: 0, 1, • Новые объекты попадают в 0 (не все) • Сборка мусора работает по поколениям piątek, 27 września 13 2
  • 34. Generations and thresholds • 3 "поколения" (списка) объектов: 0, 1, • Новые объекты попадают в 0 (не все) • Сборка мусора работает по поколениям • Объекты пережившие сборку мусора переносятся в поколение +1 piątek, 27 września 13 2
  • 35. Generations and thresholds • 3 "поколения" (списка) объектов: 0, 1, • Новые объекты попадают в 0 (не все) • Сборка мусора работает по поколениям • Объекты пережившие сборку мусора 2 переносятся в поколение +1 • Поколение 1 проверяется после threshold1 обработок поколения 0 piątek, 27 września 13
  • 36. Ограничения GC • Объекты с определенным __del__ не уничтожаются GC (он не знает в каком порядке их вызвать) • Native-объекты которые могут содержать ссылки должны правильно реализовывать tp_traverse piątek, 27 września 13
  • 37. Проблемы с __del__ • Может создать циклические ссылки с sys.exc_traceback и sys.last_traceback (их нужно явно занулить) • Исключения в __del__ игнорируются с выводом сообщения на stderr • Не вызывается при завершении программы piątek, 27 września 13
  • 38. Удаление неудаляемых объектов • Вызвать gc.collect() что бы явно запустить сборку мусора (вернет количество удаленных объектов • В gc.garbage список объектов с циклическими ссылками и __del__. Проходим по этому списку и разрываем циклические ссылки. (gc.get_referrers) • del piątek, 27 września 13 gc.garbage[:]
  • 39. Отладка • gc.DEBUG_LEAK, gc.DEBUG_* • Heapy (http://guppy-pe.sourceforge.net/) • Meliae (https://launchpad.net/meliae) • gdb-heap (https://fedorahosted.org/gdb-heap/) piątek, 27 września 13
  • 40. Альтернативы • PyPy • Отключить GC вообще и следить за деревом объектов вручную • Отключить но вызывать gc.collect() в правильные моменты времени piątek, 27 września 13