garbage collector and a bit of memory management
DESCRIPTION
Garbage collector and a bit of memory management Автор: Кирилл Лашкевич (Viber)TRANSCRIPT
![Page 1: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/1.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/2.jpg)
Модели управления памятью
• Вручную• Подсчет ссылок• Garbage Collector
piątek, 27 września 13
![Page 3: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/3.jpg)
Ручное управление
piątek, 27 września 13
![Page 4: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/4.jpg)
Ручное управление
•Переменные на стеке
piątek, 27 września 13
![Page 5: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/5.jpg)
Ручное управление
•Переменные на стеке
• alloca
piątek, 27 września 13
![Page 6: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/6.jpg)
Ручное управление
•Переменные на стеке
• alloca
•Масивы переменной длинны (C99)
piątek, 27 września 13
![Page 7: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/7.jpg)
Ручное управление
•Переменные на стеке
• alloca
•Масивы переменной длинны (C99)
• malloc/free
piątek, 27 września 13
![Page 8: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/8.jpg)
Подсчет ссылок
piątek, 27 września 13
![Page 9: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/9.jpg)
Подсчет ссылок
• retain(INCREF)/release(DECREF)
piątek, 27 września 13
![Page 10: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/10.jpg)
Подсчет ссылок
• retain(INCREF)/release(DECREF)
• autoreleasepool
piątek, 27 września 13
![Page 11: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/11.jpg)
Подсчет ссылок
• retain(INCREF)/release(DECREF)
• autoreleasepool
• weak
piątek, 27 września 13
![Page 12: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/12.jpg)
DAG(directed acyclic graph)
• Задача программиста не допускать циклов в графе объектов
piątek, 27 września 13
![Page 13: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/13.jpg)
DAG(directed acyclic graph)
• Задача программиста не допускать циклов в графе объектов
piątek, 27 września 13
![Page 14: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/14.jpg)
DAG(directed acyclic graph)
• Задача программиста не допускать циклов в графе объектов
piątek, 27 września 13
![Page 15: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/15.jpg)
Что делать если циклы нужны?
piątek, 27 września 13
![Page 16: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/16.jpg)
Что делать если циклы нужны?
•Пример: граф с циклами
piątek, 27 września 13
![Page 17: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/17.jpg)
Что делать если циклы нужны?
•Пример: граф с циклами
•Приходится устранять циклы вручную
piątek, 27 września 13
![Page 18: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/18.jpg)
Что делать если циклы нужны?
•Пример: граф с циклами
•Приходится устранять циклы вручную
piątek, 27 września 13
![Page 19: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/19.jpg)
Что делать если циклы нужны?
•Пример: граф с циклами
•Приходится устранять циклы вручную
piątek, 27 września 13
![Page 20: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/20.jpg)
Что делать если циклы нужны?
•Пример: граф с циклами
•Приходится устранять циклы вручную
piątek, 27 września 13
![Page 21: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/21.jpg)
Weak-ссылки
•Не увеличивают счетчик ссылок объекта
• Автоматически зануляются при уничтожении объекта
piątek, 27 września 13
![Page 22: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/24.jpg)
Анализ графа объектов
• Функции для анализа в модуле 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](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/25.jpg)
Модуль 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](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/26.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/27.jpg)
Ограничения
• Не все типы могут быть weak: string, list, tuple...
• Native-объекты должны реализовывать поддержку (через tp_weaklistoffset )
• Осторожно с weak словарями!
piątek, 27 września 13
![Page 28: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/28.jpg)
Garbage Collector
• Удаляет объекты, недостижимые по ссылкам из корневого объекта но с ненулевым счетчиком ссылок
piątek, 27 września 13
![Page 29: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/29.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/30.jpg)
Generations and thresholds
piątek, 27 września 13
![Page 31: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/31.jpg)
Generations and thresholds
• 3 "поколения" (списка) объектов: 0, 1, 2
piątek, 27 września 13
![Page 32: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/32.jpg)
Generations and thresholds
• 3 "поколения" (списка) объектов: 0, 1, 2
• Новые объекты попадают в 0 (не все)
piątek, 27 września 13
![Page 33: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/33.jpg)
Generations and thresholds
• 3 "поколения" (списка) объектов: 0, 1, 2
• Новые объекты попадают в 0 (не все)
• Сборка мусора работает по поколениям
piątek, 27 września 13
![Page 34: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/34.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/35.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/36.jpg)
Ограничения GC
• Объекты с определенным __del__ не уничтожаются GC (он не знает в каком порядке их вызвать)
• Native-объекты которые могут содержать ссылки должны правильно реализовывать tp_traverse
piątek, 27 września 13
![Page 37: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/37.jpg)
Проблемы с __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](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/38.jpg)
Удаление неудаляемых объектов
• Вызвать 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](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/39.jpg)
Отладка
• 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](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/40.jpg)
Альтернативы
• PyPy
• Отключить GC вообще и следить за деревом объектов вручную
• Отключить но вызывать gc.collect() в правильные моменты времени
piątek, 27 września 13
![Page 41: Garbage collector and a bit of memory management](https://reader034.vdocuments.mx/reader034/viewer/2022052323/559459861a28ab5e728b4597/html5/thumbnails/41.jpg)
Спасибоpiątek, 27 września 13