Garbage collector and a bit of memory management

41
Garbage collector and a bit of memory management Cyril @notorca Lashkevich piątek, 27 września 13

description

Garbage collector and a bit of memory management Автор: Кирилл Лашкевич (Viber)

Transcript of Garbage collector and a bit of memory management

Page 1: Garbage collector and a bit of memory management

Garbage collectorand a bit of memory

managementCyril @notorca Lashkevich

piątek, 27 września 13

Page 2: Garbage collector and a bit of memory management

Модели управления памятью

• Вручную• Подсчет ссылок• Garbage Collector

piątek, 27 września 13

Page 3: Garbage collector and a bit of memory management

Ручное управление

piątek, 27 września 13

Page 4: Garbage collector and a bit of memory management

Ручное управление

•Переменные на стеке

piątek, 27 września 13

Page 5: Garbage collector and a bit of memory management

Ручное управление

•Переменные на стеке

• alloca

piątek, 27 września 13

Page 6: Garbage collector and a bit of memory management

Ручное управление

•Переменные на стеке

• alloca

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

piątek, 27 września 13

Page 7: Garbage collector and a bit of memory management

Ручное управление

•Переменные на стеке

• alloca

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

• malloc/free

piątek, 27 września 13

Page 8: Garbage collector and a bit of memory management

Подсчет ссылок

piątek, 27 września 13

Page 9: Garbage collector and a bit of memory management

Подсчет ссылок

• retain(INCREF)/release(DECREF)

piątek, 27 września 13

Page 10: Garbage collector and a bit of memory management

Подсчет ссылок

• retain(INCREF)/release(DECREF)

• autoreleasepool

piątek, 27 września 13

Page 11: Garbage collector and a bit of memory management

Подсчет ссылок

• retain(INCREF)/release(DECREF)

• autoreleasepool

• weak

piątek, 27 września 13

Page 12: Garbage collector and a bit of memory management

DAG(directed acyclic graph)

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

piątek, 27 września 13

Page 13: Garbage collector and a bit of memory management

DAG(directed acyclic graph)

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

piątek, 27 września 13

Page 14: Garbage collector and a bit of memory management

DAG(directed acyclic graph)

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

piątek, 27 września 13

Page 15: Garbage collector and a bit of memory management

Что делать если циклы нужны?

piątek, 27 września 13

Page 16: Garbage collector and a bit of memory management

Что делать если циклы нужны?

•Пример: граф с циклами

piątek, 27 września 13

Page 17: Garbage collector and a bit of memory management

Что делать если циклы нужны?

•Пример: граф с циклами

•Приходится устранять циклы вручную

piątek, 27 września 13

Page 18: Garbage collector and a bit of memory management

Что делать если циклы нужны?

•Пример: граф с циклами

•Приходится устранять циклы вручную

piątek, 27 września 13

Page 19: Garbage collector and a bit of memory management

Что делать если циклы нужны?

•Пример: граф с циклами

•Приходится устранять циклы вручную

piątek, 27 września 13

Page 20: Garbage collector and a bit of memory management

Что делать если циклы нужны?

•Пример: граф с циклами

•Приходится устранять циклы вручную

piątek, 27 września 13

Page 21: Garbage collector and a bit of memory management

Weak-ссылки

•Не увеличивают счетчик ссылок объекта

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

piątek, 27 września 13

Page 22: Garbage collector and a bit of memory management

Python sys.getrefcount()import sys

one = []print 'At start :', sys.getrefcount(one)two = oneprint 'Second reference :', sys.getrefcount(one)del twoprint 'After del :', sys.getrefcount(one)

piątek, 27 września 13

Page 23: Garbage collector and a bit of memory management

Python sys.getrefcount()import sys

one = []print 'At start :', sys.getrefcount(one)two = oneprint 'Second reference :', sys.getrefcount(one)del twoprint 'After del :', sys.getrefcount(one)

At start : 2Second reference : 3After del : 2

piątek, 27 września 13

Page 24: Garbage collector and a bit of memory management

Анализ графа объектов

• Функции для анализа в модуле gc

• gc.get_referrers(*objs)

• gc.get_referents(*objs)

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

piątek, 27 września 13

Page 25: Garbage collector and a bit of memory management

Модуль weakref

• Слабые ссылки с callback на удаление объекта

• Proxy-объекты бросающие исключение при использовании удаленного объекта (not hashable!)

• WeakValue и WeakKey словари

• WeakSet (3.2)

piątek, 27 września 13

Page 26: Garbage collector and a bit of memory management

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 objDeleting Expencive objectIn [19]: print('r():', r())r(): None

piątek, 27 września 13

Page 27: Garbage collector and a bit of memory management

Ограничения

• Не все типы могут быть weak: string, list, tuple...

• Native-объекты должны реализовывать поддержку (через tp_weaklistoffset )

• Осторожно с weak словарями!

piątek, 27 września 13

Page 28: Garbage collector and a bit of memory management

Garbage Collector

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

piątek, 27 września 13

Page 29: Garbage collector and a bit of memory management

GC в python

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

• Либо вручную gc.collect()

• Low memory, idle не инициируют сборку мусора

• Может работать долго

piątek, 27 września 13

Page 30: Garbage collector and a bit of memory management

Generations and thresholds

piątek, 27 września 13

Page 31: Garbage collector and a bit of memory management

Generations and thresholds

• 3 "поколения" (списка) объектов: 0, 1, 2

piątek, 27 września 13

Page 32: Garbage collector and a bit of memory management

Generations and thresholds

• 3 "поколения" (списка) объектов: 0, 1, 2

• Новые объекты попадают в 0 (не все)

piątek, 27 września 13

Page 33: Garbage collector and a bit of memory management

Generations and thresholds

• 3 "поколения" (списка) объектов: 0, 1, 2

• Новые объекты попадают в 0 (не все)

• Сборка мусора работает по поколениям

piątek, 27 września 13

Page 34: Garbage collector and a bit of memory management

Generations and thresholds

• 3 "поколения" (списка) объектов: 0, 1, 2

• Новые объекты попадают в 0 (не все)

• Сборка мусора работает по поколениям• Объекты пережившие сборку мусора переносятся в поколение +1

piątek, 27 września 13

Page 35: Garbage collector and a bit of memory management

Generations and thresholds

• 3 "поколения" (списка) объектов: 0, 1, 2

• Новые объекты попадают в 0 (не все)

• Сборка мусора работает по поколениям• Объекты пережившие сборку мусора переносятся в поколение +1

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

piątek, 27 września 13

Page 36: Garbage collector and a bit of memory management

Ограничения GC

• Объекты с определенным __del__ не уничтожаются GC (он не знает в каком порядке их вызвать)

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

piątek, 27 września 13

Page 37: Garbage collector and a bit of memory management

Проблемы с __del__

• Может создать циклические ссылки с sys.exc_traceback и sys.last_traceback (их нужно явно занулить)

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

• Не вызывается при завершении программы

piątek, 27 września 13

Page 38: Garbage collector and a bit of memory management

Удаление неудаляемых объектов

• Вызвать gc.collect() что бы явно запустить сборку мусора (вернет количество удаленных объектов

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

• del gc.garbage[:]piątek, 27 września 13

Page 39: Garbage collector and a bit of memory management

Отладка

• 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

Page 40: Garbage collector and a bit of memory management

Альтернативы

• PyPy

• Отключить GC вообще и следить за деревом объектов вручную

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

piątek, 27 września 13

Page 41: Garbage collector and a bit of memory management

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