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

1,344

Published on

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

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,344
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
18
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×