Управление памятью в .NET для профессионалов
Написание более качественного, производительного и масштабируемого кода
Покупка
Тематика:
Программирование и алгоритмизация
Издательство:
ДМК Пресс
Автор:
Кокоса Конрад
Год издания: 2020
Кол-во страниц: 800
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-97060-800-5
Артикул: 748342.01.99
Хотя в .NET управление памятью осуществляется автоматически, понимание того, как именно это делается, сулит немало преимуществ. Вы сможете писать более качественные программы, эффективно взаимодействующие с памятью. Книга содержит 25 сценариев поиска и устранения неисправностей, призванных помочь в диагностике сложных проблем при работе с памятью. Приводится также ряд полезных рекомендаций по написанию кода, учитывающих особенности управления памятью и позволяющих избежать типичных ошибок.
Книга адресована разработчикам программного обеспечения для платформы .NET, архитекторам и специалистам по производительности.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Конрад Кокоса Управление памятью в .NET для профессионалов
Pro .NET Memory Management For Better Code, Performance, and Scalability Konrad Kokosa
Управление памятью в .NET для профессионалов Написание более качественного, производительного и масштабируемого кода Конрад Кокоса Москва, 2020
УДК 004.438.NET ББК 32.973.26-018.2 К55 Кокоса К. К55 Управление памятью в .NET для профессионалов. – М.: ДМК Пресс, 2020. – 800 с.: ил. ISBN 978-5-97060-800-5 Хотя в .NET управление памятью осуществляется автоматически, понимание того, как именно это делается, сулит немало преимуществ. Вы сможете писать более качественные программы, эффективно взаимодействующие с памятью. Книга содержит 25 сценариев поиска и устранения неисправностей, призванных помочь в диагностике сложных проблем при работе с памятью. Приводится также ряд полезных рекомендаций по написанию кода, учитывающих особенности управления памятью и позволяющих избежать типичных ошибок. Книга адресована разработчикам программного обеспечения для платформы .NET, архитекторам и специалистам по производительности. УДК 004.438.NET ББК 32.973.26-018.2 Original English language edition printed on acid-free paper. Copyright © 2018 by Konrad Kokosa. Russian language edition copyright © 2020 by DMK Press. All rights reserved. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. ISBN 978-1-4842-4026-7 (англ.) Copyright © 2018 by Konrad Kokosa ISBN 978-5-97060-800-5 (рус.) © Оформление, издание, перевод, ДМК Пресс, 2020
Моей любимой жене Юстине, без которой в моей жизни не случилось бы ничего сколько-нибудь важного
Содержание Об авторе ............................................................................................................................ 15 О технических рецензентах .................................................................................... 15 Благодарности .................................................................................................................. 16 Предисловие ..................................................................................................................... 18 Введение ............................................................................................................................. 19 От издательства ............................................................................................................... 25 Глава 1. Основные понятия ...................................................................................... 26 Терминология, относящаяся к памяти .................................................................................... 27 Статическое выделение ....................................................................................................... 33 Регистровая машина ............................................................................................................ 34 Стек ....................................................................................................................................... 35 Стековая машина ................................................................................................................. 40 Указатель .............................................................................................................................. 43 Куча ....................................................................................................................................... 45 Ручное управление памятью ................................................................................................... 47 Автоматическое управление памятью.................................................................................... 52 Распределитель, модификатор и сборщик ......................................................................... 54 Подсчет ссылок ......................................................................................................................... 58 Отслеживающий сборщик ....................................................................................................... 63 Этап пометки ........................................................................................................................ 63 Этап сборки .......................................................................................................................... 67 Немного истории ...................................................................................................................... 71 Резюме ....................................................................................................................................... 73 Правило 1: учиться, учиться и учиться ............................................................................... 74 Глава 2. Низкоуровневое управление памятью .......................................... 75 Оборудование ........................................................................................................................... 76 Память ................................................................................................................................... 81 Центральный процессор ...................................................................................................... 84 Операционная система ............................................................................................................ 99 Виртуальная память ........................................................................................................... 100 Большие страницы ............................................................................................................. 104 Фрагментация виртуальной памяти ................................................................................ 105 Общая структура памяти ................................................................................................... 105 Управление памятью в Windows ....................................................................................... 107 Организация памяти в Windows ....................................................................................... 112
Содержание 7 Управление памятью в Linux ............................................................................................ 114 Организация памяти в Linux ............................................................................................. 116 Зависимость от операционной системы .......................................................................... 117 NUMA и группы процессоров................................................................................................. 118 Резюме ..................................................................................................................................... 120 Правило 2: избегайте произвольного доступа, отдавайте предпочтение последовательному ............................................................................................................ 120 Правило 3: улучшайте пространственную и временную локальность данных ............. 121 Правило 4: пользуйтесь продвинутыми средствами....................................................... 121 Глава 3. Измерения памяти .................................................................................... 123 Измеряйте как можно раньше ............................................................................................... 124 Накладные расходы и вмешательство .............................................................................. 125 Выборка и трассировка ...................................................................................................... 126 Дерево вызовов .................................................................................................................. 126 Графы объектов .................................................................................................................. 127 Статистика .......................................................................................................................... 129 Задержка и пропускная способность ................................................................................ 132 Дампы памяти, трассировка, динамическая отладка ...................................................... 133 Среда Windows ........................................................................................................................ 134 Краткий обзор .................................................................................................................... 134 VMMap................................................................................................................................. 135 Счетчики производительности ......................................................................................... 136 Трассировка событий для Windows .................................................................................. 142 Windows Performance Toolkit ............................................................................................. 152 PerfView ............................................................................................................................... 162 ProcDump и DebugDiag ....................................................................................................... 171 WinDbg ................................................................................................................................ 171 Дизассемблеры и декомпиляторы .................................................................................... 174 BenchmarkDotNet ............................................................................................................... 174 Коммерческие инструменты ............................................................................................. 176 Среда Linux .............................................................................................................................. 186 Краткий обзор .................................................................................................................... 186 Perfcollect ............................................................................................................................ 187 Trace Compass ..................................................................................................................... 189 Дампы памяти .................................................................................................................... 198 Резюме ..................................................................................................................................... 199 Правило 5: измеряйте GC как можно раньше .................................................................. 201 Глава 4. Фундаментальные основы .NET ....................................................... 202 Версии .NET ............................................................................................................................. 202 Детали внутреннего устройства .NET.................................................................................... 205 Разбираем пример программы ......................................................................................... 208 Сборки и домены приложений .............................................................................................. 213 Забираемые сборки ............................................................................................................ 215 Области памяти процесса ...................................................................................................... 216 Сценарий 4.1. Сколько места в памяти занимает моя программа? ............................... 220 Сценарий 4.2. Моя программа потребляет все больше и больше памяти ..................... 222 Сценарий 4.3. Моя программа потребляет все больше и больше памяти ..................... 225 Сценарий 4.4. Моя программа потребляет все больше и больше памяти ..................... 227 Система типов ......................................................................................................................... 230
Содержание Категории типов ................................................................................................................. 231 Хранение типов .................................................................................................................. 232 Типы значений ................................................................................................................... 233 Ссылочные типы ................................................................................................................ 241 Строки ..................................................................................................................................... 246 Интернирование строк ...................................................................................................... 252 Сценарий 4.5. Моя программа потребляет слишком много памяти .............................. 257 Упаковка и распаковка ........................................................................................................... 259 Передача по ссылке ................................................................................................................ 264 Передача по ссылке экземпляра типа значений ............................................................. 264 Передача по ссылке экземпляра ссылочного типа .......................................................... 265 Локальность типов данных .................................................................................................... 266 Статические данные ............................................................................................................... 269 Статические поля ............................................................................................................... 269 Внутреннее устройство статических данных ................................................................... 270 Резюме ..................................................................................................................................... 273 Структуры ........................................................................................................................... 274 Классы ................................................................................................................................. 274 Глава 5. Разделение памяти на части .............................................................. 277 Стратегии разделения памяти ............................................................................................... 278 Разделение по размеру .......................................................................................................... 279 Куча малых объектов ......................................................................................................... 280 Куча больших объектов ...................................................................................................... 281 Разделение по времени жизни .............................................................................................. 284 Сценарий 5.1. Как чувствует себя моя программа? Динамика размеров поколений ... 290 Запомненные наборы (Remembered sets) ......................................................................... 292 Таблицы карт (Card tables) ................................................................................................. 298 Связки карт ......................................................................................................................... 303 Физическое разделение ......................................................................................................... 306 Сценарий 5.2. Утечка памяти в nopCommerce? ................................................................ 311 Сценарий 5.3. Растранжиривание кучи больших объектов? .......................................... 319 Анатомия сегментов и кучи .............................................................................................. 321 Повторное использование сегментов ............................................................................... 324 Резюме ..................................................................................................................................... 326 Правило 11: следите за размерами поколений ................................................................ 326 Правило 12: избегайте лишних ссылок в куче ................................................................. 327 Правило 13: наблюдайте за использованием сегментов ................................................ 328 Глава 6. Выделение памяти ................................................................................... 329 Введение в распределение памяти ....................................................................................... 329 Выделение памяти сдвигом указателя.................................................................................. 330 Выделение памяти из списка свободных блоков ................................................................. 337 Создание нового объекта ....................................................................................................... 341 Выделение памяти в куче малых объектов ...................................................................... 343 Выделение памяти в куче больших объектов .................................................................. 347 Балансировка кучи ................................................................................................................. 351 Исключение OutOfMemoryException ..................................................................................... 353 Сценарий 6.1. Нехватка памяти ........................................................................................ 355 Выделение памяти в стеке ..................................................................................................... 356 Избегание выделения памяти ............................................................................................... 358
Содержание 9 Явное выделение памяти для ссылочных типов ............................................................. 360 Скрытое выделение памяти .............................................................................................. 381 Скрытое выделение памяти в библиотеках ..................................................................... 389 Сценарий 6.2. Исследование выделения памяти ............................................................. 393 Сценарий 6.3. Функции Azure ........................................................................................... 396 Резюме ..................................................................................................................................... 397 Правило 14: избегайте выделения памяти в куче на критических с точки зрения производительности участках программы ...................................................................... 397 Правило 15: избегайте дорогостоящего выделения памяти в LOH ................................ 398 Правило 16: по возможности выделяйте память в стеке ................................................ 398 Глава 7. Сборка мусора – введение ................................................................... 400 Общее описание ..................................................................................................................... 400 Пример процесса сборки мусора ........................................................................................... 402 Шаги процесса сборки мусора ............................................................................................... 408 Сценарий 7.1. Анализ использования GC ......................................................................... 408 Профилирование GC .............................................................................................................. 412 Данные для настройки производительности сборки мусора .............................................. 414 Статические данные .......................................................................................................... 414 Динамические данные ....................................................................................................... 417 Сценарий 7.2. Демонстрация бюджета выделения .......................................................... 419 Инициаторы сборки мусора................................................................................................... 428 Запуск по причине выделения памяти............................................................................. 429 Явный запуск ...................................................................................................................... 430 Сценарий 7.3. Анализ явных вызовов GC ......................................................................... 433 Запуск по причине нехватки памяти у системы .............................................................. 439 Запуск по различным внутренним причинам ................................................................. 439 Приостановка движка выполнения ....................................................................................... 440 Сценарий 7.4. Анализ времени приостановки GC ........................................................... 442 Выбор поколения для сборки................................................................................................. 444 Сценарий 7.5. Анализ выбираемых поколений ............................................................... 447 Резюме ..................................................................................................................................... 448 Глава 8. Сборка мусора – этап пометки ......................................................... 449 Обход и пометка объектов ..................................................................................................... 449 Корни – локальные переменные ........................................................................................... 450 Хранилище локальных переменных ................................................................................ 451 Корни на стеке .................................................................................................................... 452 Лексическая область видимости ....................................................................................... 452 Живые стековые корни и лексическая область видимости ............................................ 453 Живые стековые корни с ранней сборкой корней .......................................................... 455 Информация для GC (GC Info) ........................................................................................... 461 Закрепленные локальные переменные ............................................................................ 465 Просмотр стековых корней ............................................................................................... 468 Корни финализации ............................................................................................................... 468 Внутренние корни GC............................................................................................................. 469 Корни – описатели GC ............................................................................................................ 470 Анализ утечек памяти ............................................................................................................ 476 Сценарий 8.1. Утечка памяти в nopCommerce? ................................................................ 478 Сценарий 8.2. Нахождение самых популярных корней .................................................. 482 Резюме ..................................................................................................................................... 484
Содержание Глава 9. Сборка мусора – этап планирования ............................................ 485 Куча малых объектов .............................................................................................................. 486 Заполненные и пустые блоки ............................................................................................ 486 Сценарий 9.1. Дамп памяти с поврежденными структурами ......................................... 491 Таблица кирпичей .............................................................................................................. 492 Закрепление ....................................................................................................................... 494 Сценарий 9.2. Исследование закрепления ....................................................................... 499 Границы поколений ........................................................................................................... 504 Оставление ......................................................................................................................... 504 Куча больших объектов .......................................................................................................... 509 Заполненные и пустые блоки ............................................................................................ 509 Принятие решения об уплотнении ....................................................................................... 511 Резюме ..................................................................................................................................... 512 Глава 10. Сборка мусора – очистка и уплотнение ................................... 513 Этап очистки ........................................................................................................................... 513 Куча малых объектов ......................................................................................................... 513 Куча больших объектов ...................................................................................................... 514 Этап уплотнения ..................................................................................................................... 515 Куча малых объектов ......................................................................................................... 515 Куча больших объектов ...................................................................................................... 519 Сценарий 10.1. Фрагментация кучи больших объектов .................................................. 520 Резюме ..................................................................................................................................... 528 Правило 17: следите за приостановкой среды выполнения ........................................... 529 Правило 18: избегайте кризиса среднего возраста ......................................................... 529 Правило 19: избегайте фрагментации старого поколения и LOH .................................. 530 Правило 20: избегайте явной сборки мусора ................................................................... 531 Правило 21: избегайте утечек памяти .............................................................................. 531 Правило 22: избегайте закрепления ................................................................................. 532 Глава 11. Варианты сборки мусора ................................................................... 533 Обзор режимов ....................................................................................................................... 533 Режим рабочей станции и серверный режим .................................................................. 533 Неконкурентный и конкурентный режим ....................................................................... 535 Конфигурирование режимов ................................................................................................. 536 .NET Framework .................................................................................................................. 537 .NET Core ............................................................................................................................. 537 Приостановка и накладные расходы GC ............................................................................... 538 Описание режимов ................................................................................................................. 540 Неконкурентный режим рабочей станции ...................................................................... 541 Конкурентный режим рабочей станции (до версии 4.0) ................................................. 542 Фоновый режим рабочей станции .................................................................................... 544 Неконкурентный серверный режим ................................................................................. 552 Фоновый серверный режим .............................................................................................. 554 Режимы задержки ................................................................................................................... 556 Пакетный режим ................................................................................................................ 556 Интерактивный режим ...................................................................................................... 557 Режим низкой задержки .................................................................................................... 557 Режим длительной низкой задержки ............................................................................... 558 Регион без сборки мусора (No GC Region) ........................................................................ 559 Цели оптимизации задержки ............................................................................................ 562