Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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ś...
Python sys.getrefcount()
import sys
one = []
print 'At start
:',
sys.getrefcount(one)
two = one
print 'Second reference :'...
Python sys.getrefcount()
import sys
one = []
print 'At start
:',
sys.getrefcount(one)
two = one
print 'Second reference :'...
Анализ графа объектов
• Функции для анализа в модуле gc
• gc.get_referrers(*objs)
• gc.get_referents(*objs)
• Native-объек...
Модуль weakref
• Слабые ссылки с callback на удаление объекта
• Proxy-объекты бросающие исключение при

использовании удал...
In [11]: obj = ExpensiveObject()
In [12]: r = weakref.ref(obj)
In [15]: print('obj:', obj)
obj: <__main__.ExpensiveObject ...
Ограничения
• Не все типы могут быть weak: string, list,
tuple...

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

поддержку (через...
Garbage Collector
• Удаляет объекты,

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

piątek...
GC в python
• Запускается когда колличество созданых

объектов поколения превышает количество
удаленных на х (по умолчанию...
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...
Generations and thresholds
• 3 "поколения" (списка) объектов: 0, 1,
• Новые объекты попадают в 0 (не все)
• Сборка мусора ...
Generations and thresholds
• 3 "поколения" (списка) объектов: 0, 1,
• Новые объекты попадают в 0 (не все)
• Сборка мусора ...
Generations and thresholds
• 3 "поколения" (списка) объектов: 0, 1,
• Новые объекты попадают в 0 (не все)
• Сборка мусора ...
Ограничения GC
• Объекты с определенным __del__ не
уничтожаются GC (он не знает в каком
порядке их вызвать)

• Native-объе...
Проблемы с __del__
• Может создать циклические ссылки с

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

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

запустить сборку мусора (вернет количество
удаленных объ...
Отладка
• gc.DEBUG_LEAK, gc.DEBUG_*
• Heapy (http://guppy-pe.sourceforge.net/)
• Meliae (https://launchpad.net/meliae)
• g...
Альтернативы
• PyPy
• Отключить GC вообще и следить за деревом
объектов вручную

• Отключить но вызывать gc.collect() в
пр...
Спасибо
piątek, 27 września 13
Upcoming SlideShare
Loading in …5
×

Garbage collector and a bit of memory management

2,274 views

Published on

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

Published in: Technology
  • Be the first to comment

Garbage collector and a bit of memory management

  1. 1. Garbage collector and a bit of memory management Cyril @notorca Lashkevich piątek, 27 września 13
  2. 2. Модели управления памятью • Вручную • Подсчет ссылок • Garbage Collector piątek, 27 września 13
  3. 3. Ручное управление piątek, 27 września 13
  4. 4. Ручное управление • Переменные на стеке piątek, 27 września 13
  5. 5. Ручное управление • Переменные на стеке • alloca piątek, 27 września 13
  6. 6. Ручное управление • Переменные на стеке • alloca • Масивы переменной длинны (C99) piątek, 27 września 13
  7. 7. Ручное управление • Переменные на стеке • alloca • Масивы переменной длинны (C99) • malloc/free piątek, 27 września 13
  8. 8. Подсчет ссылок piątek, 27 września 13
  9. 9. Подсчет ссылок • retain(INCREF)/ release(DECREF) piątek, 27 września 13
  10. 10. Подсчет ссылок • retain(INCREF)/ release(DECREF) • autoreleasepool piątek, 27 września 13
  11. 11. Подсчет ссылок • retain(INCREF)/ release(DECREF) • autoreleasepool • weak piątek, 27 września 13
  12. 12. DAG (directed acyclic graph) • Задача программиста не допускать циклов в графе объектов piątek, 27 września 13
  13. 13. DAG (directed acyclic graph) • Задача программиста не допускать циклов в графе объектов piątek, 27 września 13
  14. 14. DAG (directed acyclic graph) • Задача программиста не допускать циклов в графе объектов piątek, 27 września 13
  15. 15. Что делать если циклы нужны? piątek, 27 września 13
  16. 16. Что делать если циклы нужны? • Пример: граф с циклами piątek, 27 września 13
  17. 17. Что делать если циклы нужны? • Пример: граф с циклами • Приходится устранять циклы вручную piątek, 27 września 13
  18. 18. Что делать если циклы нужны? • Пример: граф с циклами • Приходится устранять циклы вручную piątek, 27 września 13
  19. 19. Что делать если циклы нужны? • Пример: граф с циклами • Приходится устранять циклы вручную piątek, 27 września 13
  20. 20. Что делать если циклы нужны? • Пример: граф с циклами • Приходится устранять циклы вручную piątek, 27 września 13
  21. 21. Weak-ссылки • Не увеличивают счетчик ссылок объекта • Автоматически зануляются при уничтожении объекта piątek, 27 września 13
  22. 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. 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. 24. Анализ графа объектов • Функции для анализа в модуле gc • gc.get_referrers(*objs) • gc.get_referents(*objs) • Native-объекты должны предоставлять метод tp_traverse piątek, 27 września 13
  25. 25. Модуль weakref • Слабые ссылки с callback на удаление объекта • Proxy-объекты бросающие исключение при использовании удаленного объекта (not hashable!) • WeakValue и WeakKey словари • WeakSet (3.2) piątek, 27 września 13
  26. 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. 27. Ограничения • Не все типы могут быть weak: string, list, tuple... • Native-объекты должны реализовывать поддержку (через tp_weaklistoffset ) • Осторожно с weak словарями! piątek, 27 września 13
  28. 28. Garbage Collector • Удаляет объекты, недостижимые по ссылкам из корневого объекта но с ненулевым счетчиком ссылок piątek, 27 września 13
  29. 29. GC в python • Запускается когда колличество созданых объектов поколения превышает количество удаленных на х (по умолчанию 700, 10, 10) • Либо вручную gc.collect() • Low memory, idle не инициируют сборку мусора • Может работать долго piątek, 27 września 13
  30. 30. Generations and thresholds piątek, 27 września 13
  31. 31. Generations and thresholds • 3 "поколения" (списка) объектов: 0, piątek, 27 września 13 1, 2
  32. 32. Generations and thresholds • 3 "поколения" (списка) объектов: 0, 1, • Новые объекты попадают в 0 (не все) piątek, 27 września 13 2
  33. 33. Generations and thresholds • 3 "поколения" (списка) объектов: 0, 1, • Новые объекты попадают в 0 (не все) • Сборка мусора работает по поколениям piątek, 27 września 13 2
  34. 34. Generations and thresholds • 3 "поколения" (списка) объектов: 0, 1, • Новые объекты попадают в 0 (не все) • Сборка мусора работает по поколениям • Объекты пережившие сборку мусора переносятся в поколение +1 piątek, 27 września 13 2
  35. 35. Generations and thresholds • 3 "поколения" (списка) объектов: 0, 1, • Новые объекты попадают в 0 (не все) • Сборка мусора работает по поколениям • Объекты пережившие сборку мусора 2 переносятся в поколение +1 • Поколение 1 проверяется после threshold1 обработок поколения 0 piątek, 27 września 13
  36. 36. Ограничения GC • Объекты с определенным __del__ не уничтожаются GC (он не знает в каком порядке их вызвать) • Native-объекты которые могут содержать ссылки должны правильно реализовывать tp_traverse piątek, 27 września 13
  37. 37. Проблемы с __del__ • Может создать циклические ссылки с sys.exc_traceback и sys.last_traceback (их нужно явно занулить) • Исключения в __del__ игнорируются с выводом сообщения на stderr • Не вызывается при завершении программы piątek, 27 września 13
  38. 38. Удаление неудаляемых объектов • Вызвать gc.collect() что бы явно запустить сборку мусора (вернет количество удаленных объектов • В gc.garbage список объектов с циклическими ссылками и __del__. Проходим по этому списку и разрываем циклические ссылки. (gc.get_referrers) • del piątek, 27 września 13 gc.garbage[:]
  39. 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. 40. Альтернативы • PyPy • Отключить GC вообще и следить за деревом объектов вручную • Отключить но вызывать gc.collect() в правильные моменты времени piątek, 27 września 13
  41. 41. Спасибо piątek, 27 września 13

×