Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Управление памятью в .NET для профессионалов

Написание более качественного, производительного и масштабируемого кода
Покупка
Артикул: 748342.01.99
Доступ онлайн
1 899 ₽
В корзину
Хотя в .NET управление памятью осуществляется автоматически, понимание того, как именно это делается, сулит немало преимуществ. Вы сможете писать более качественные программы, эффективно взаимодействующие с памятью. Книга содержит 25 сценариев поиска и устранения неисправностей, призванных помочь в диагностике сложных проблем при работе с памятью. Приводится также ряд полезных рекомендаций по написанию кода, учитывающих особенности управления памятью и позволяющих избежать типичных ошибок. Книга адресована разработчикам программного обеспечения для платформы .NET, архитекторам и специалистам по производительности.
Кокоса, К. Управление памятью в .NET для профессионалов : практическое руководство / К. Кокоса. - Москва : ДМК Пресс, 2020. - 800 с. - ISBN 978-5-97060-800-5. - Текст : электронный. - URL: https://znanium.com/catalog/product/1210679 (дата обращения: 30.11.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов
Конрад Кокоса

Управление памятью в .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

Доступ онлайн
1 899 ₽
В корзину