Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2018. Михаил Ярийчук (Hibernating Rhinos) — Garbage Collector — друг или враг?

CodeFest 2018. Михаил Ярийчук (Hibernating Rhinos) — Garbage Collector — друг или враг?

Посмотрите выступление Михаила: https://2018.codefest.ru/lecture/1244/

Сборщик мусора в .Net это замечательная штука, позволяющая разработчикам быстрее писать код, не отвлекаясь на порой весьма замысловатое управление памятью.

Но иногда, сборка мусора может стать не такой уж замечательной, заставляя программу виснуть на длительное время, доходящее до абсурдных 90% от времени исполнения (или выше!)

Что-же делать?
В своем докладе, я расскажу о сборщике мусора в .Net, как он влияет на производительность и что можно сделать для сокращения количества провисаний и увеличения скорости работы программ.

Уровень: некоторе знание/опыт разработки на .Net, Java. Разработчики, технические менеджеры.

CodeFest

April 09, 2018
Tweet

More Decks by CodeFest

Other Decks in Programming

Transcript

  1. Garbage Collector : Лучший друг программиста • Эффективность à не

    нужно вручную контролировать память • Стабильность à нет утечек памяти, нет buffer overflow https://www.flickr.com/photos/oakleyoriginals/3526895658
  2. Managed Heap • Аллокатор • Внутри “managed heap” сложность резервации

    памяти О(1) • Больше памяти для программного процесса à увеличивает “managed heap” • Сборщик Мусора • Подбирает ненужную память à “мусор”
  3. Когда запускается GC? • Бюджет резерваций памяти • Kоличествo обьектов

    которые остаюся после GC (чем больше выживет, тем больше бюджет резерваций) • Фрагментированность различных поколений
  4. Простые оптимизации • Как можно меньше резерваций памяти • Долго-живущие

    обьекты эффективнее коротко-живущих • Generic и синхронные коллекции не эффективны • ArraySegment<T>, StringSegment<T>, Span<T> • Кэширование, Объектный пул
  5. Stack memory • Эффективно резервирует и освобождает память • Не

    приводит к GC • Предназначена для коротко-живущих объектов • Предназначена для небольших объектов (иначе StackOverflowExceptions) • Только для простых типов (Primitives)
  6. Unmanaged Heap • Детерминистичная резервация и освобождение à не зависит

    от GC • Возможность подогнать алгоритмы аллокаторов к специфическим задачам
  7. Memory Allocator • Алгоритм контролирующий резервацию и освобождение памяти •

    Сложность резервации и освобождения не всегда тривиальна
  8. Свободные Сегменты Монотонный Аллокатор Сегмент 1 64KB Сегмент 2 64KB

    Сегмент 3 64KB Сегмент 4 64KB Сегмент 5 64KB Указатель на следующий свободный сегмент Зарезервированные Сегменты
  9. Memory Allocator – Вариация Multipool (Buddy System) 256KB 128KB 64KB

    64KB 128KB 64KB 64KB Сегмент 1 64KB Сегмент 2 64KB Сегмент 3 64KB Сегмент 4 64KB
  10. Multipool (Buddy System) – резервация памяти 256KB 128KB 64KB 64KB

    128KB 64KB 64KB Сегмент 1 64KB Сегмент 2 64KB Сегмент 3 64KB Сегмент 4 64KB Резервируем сегмент Пометим как частично зарезервированный
  11. Multipool (Buddy System) – освобождение памяти 256KB 128KB 64KB 64KB

    128KB 64KB 64KB Сегмент 1 64KB Сегмент 2 64KB Сегмент 3 64KB Сегмент 4 64KB Свободный Сегмент? Освобождаем сегмент
  12. На что обращать внимание • Сложность резервации и освобождения памяти

    • Многопоточность • Длительность операций • Плотность (частота) резерваций • Вариации величин сегментов
  13. Некоторые известные аллокаторы • TCMalloc à http://goog-perftools.sourceforge.net/doc/tcmalloc.html • Hoard à

    https://github.com/emeryberger/Hoard • Jemalloc.NET à https://github.com/allisterb/jemalloc.NET • Специализированные à https://github.com/mtrebi/memory-allocators
  14. Тест на производительность RavenDB 4.0 RC (build 40019) • Managed

    Heap • Unmanaged memory • Сериализация/Десериализация • Манипуляции со строками RavenDB 3.5.5 (build 35223) • Только Managed Heap Загружаем 1,000,000 документов в базу данных CPU: i7-4770 Памаять: 16GB Диск: SSD
  15. Баги? Какие баги? • Fail fast, fail often • Аллокатор

    Electric Fence • Reference counting + finalizers • Старый добрый printf debugging • Сохранять StackTrace в важных точках
  16. Подытожим • GC может ухудшить производительность • Stack Memory à

    Полезная штука. Иногда. • Unmanaged memory – не так уж и страшно • Unmanaged memory à меньше циклов GC • Не стоит использовать LINQ в критическом коде
  17. @myarichuk Вопросы? [email protected] Михаил Ярийчук • Wizard Apprentice • Software

    Developer Hibernating Rhinos https://github.com/ravendb/ravendb/tree/v4.0/src/Sparrow