Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
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 (дата обращения: 19.04.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

Содержание  11

Выбор варианта GC ................................................................................................................. 562
Сценарий 8.1. Проверка параметров GC .......................................................................... 563
Сценарий 8.2. Измерение и тестирование производительности различных  
режимов GC ........................................................................................................................ 566
Резюме ..................................................................................................................................... 573
Правило 23: выбирайте режим GC обдуманно ................................................................ 573
Правило 24: помните о режимах задержки ...................................................................... 574

Глава 12. Время жизни объекта .......................................................................... 575
Жизненные циклы объекта и ресурса ................................................................................... 575
Финализация ........................................................................................................................... 577
Введение ............................................................................................................................. 577
Проблема ранней сборки корней ...................................................................................... 582
Критические финализаторы ............................................................................................. 585
Внутреннее устройство финализации .............................................................................. 586
Сценарий 12.1. Утечка памяти из-за финализации......................................................... 593
Воскрешение ...................................................................................................................... 599
Уничтожаемые объекты ......................................................................................................... 603
Безопасные описатели ........................................................................................................... 609
Слабые ссылки ........................................................................................................................ 614
Кеширование ...................................................................................................................... 618
Паттерн слабых событий ................................................................................................... 620
Сценарий 9.2. Утечка памяти из-за событий ................................................................... 626
Резюме ..................................................................................................................................... 629
Правило 25: избегайте финализаторов ............................................................................ 629
Правило 26: отдавайте предпочтение явной очистке ..................................................... 630

Глава 13. Разное ............................................................................................................ 632
Зависимые описатели ............................................................................................................ 632
Локальная память потока ...................................................................................................... 638
Статические поля потока ................................................................................................... 638
Слоты данных потока ........................................................................................................ 641
Внутреннее устройство локальной памяти потока ......................................................... 642
Сценарии использования .................................................................................................. 649
Управляемые указатели ......................................................................................................... 650
Ссылочные локальные переменные ................................................................................. 651
Возвращаемые ссылочные значения ................................................................................ 652
Постоянные ссылочные переменные и in-параметры .................................................... 654
Внутреннее устройство ссылочных типов ....................................................................... 658
Управляемые указатели в C# – ссылочные переменные ................................................. 669
И снова о структурах .............................................................................................................. 675
Постоянные структуры ...................................................................................................... 676
Ссылочные структуры (byref-подобные типы)................................................................. 677
Буферы фиксированного размера .................................................................................... 679
Размещение объектов и структур в памяти ..................................................................... 683
Ограничение unmanaged ........................................................................................................ 694
Непреобразуемые типы ..................................................................................................... 698
Резюме ..................................................................................................................................... 700

Глава 14. Продвинутые приемы ......................................................................... 701

Span<T> и Memory<T> ............................................................................................................ 701
Span<T> ............................................................................................................................... 702

 Содержание

Memory<T> .......................................................................................................................... 716
IMemoryOwner<T> .............................................................................................................. 719
Внутреннее устройство Memory<T> .................................................................................. 723
Рекомендации по работе с Span<T> и Memory<T> .......................................................... 725
Класс Unsafe ............................................................................................................................ 726
Внутреннее устройство Unsafe .......................................................................................... 730
Проектирование, ориентированное на данные ................................................................... 731
Тактическое проектирование ........................................................................................... 732
Стратегическое проектирование ...................................................................................... 736
Еще немного о будущем... ...................................................................................................... 745
Ссылочные типы, допускающие null ................................................................................ 746
Конвейеры .......................................................................................................................... 751
Резюме ..................................................................................................................................... 757

Глава 15. Интерфейсы прикладного программирования (API)....... 759

GC API ...................................................................................................................................... 759
Сведения и статистические данные о сборке мусора ...................................................... 760
Уведомления GC ................................................................................................................. 768
Контроль потребления неуправляемой памяти .............................................................. 770
Явная сборка мусора .......................................................................................................... 770
Области без GC ................................................................................................................... 770
Управление финализацией ............................................................................................... 770
Потребление памяти .......................................................................................................... 771
Внутренние вызовы в классе GC ....................................................................................... 772
Размещение CLR ..................................................................................................................... 773
ClrMD ....................................................................................................................................... 782
Библиотека TraceEvent ........................................................................................................... 787
Пользовательский сборщик мусора ...................................................................................... 790
Резюме ..................................................................................................................................... 793

Предметный указатель ............................................................................................. 795

С далекого 2002 года и до 2016 года .NET Framework оставался продуктом с закрытым исходным кодом. С появлением .NET Core разработчики смогли узнать, как 
платформа работает, какие технические решения были использованы в тех или 
иных местах. Одна из самых сложных подсистем .NET – это, вне всякого сомнения, 
сборщик мусора. Это тот элемент платформы, с которым так или иначе сталкивается каждый разработчик. При этом про сборщик мусора было известно довольно 
мало. Но и то немногое, что было известно, позволяло его успешно использовать. 
С другой стороны, механизмы управления памятью в .NET являются источником 
огромного количества мифов и недопониманий. Теперь, когда мы можем изучить 
исходный код, есть возможность развеять все мифы и понять, как устроена сборка 
мусора в .NET.
И вот вы держите в руках уникальную книгу. На сотнях страниц автор последовательно излагает всю информацию, необходимую для понимания работы с памятью на платформе .NET. Это книга не только про сборку мусора. Автор уделяет 
достаточно внимания и аппаратному уровню, и практическим аспектам программирования на платформе .NET, связанным с использованием памяти. Однако основной объем книги посвящен подробному разбору всех тонкостей работы современного сборщика мусора в .NET. Казалось бы, внутреннее устройство сборщика 
мусора не особенно полезно при разработке бизнес-приложений, однако это совсем не так. Такая сложная система, как сборщик мусора, не обходится без интересных инженерных решений, изучая которые, можно существенно расширить 
свои знания о платформе .NET и программировании в целом. Кроме того, каждая 
глава сопровождается полезными практическими выводами, рекомендациями 
и примерами использования инструментов отладки и профилирования. Книга 
будет полезна всем, кто интересуется внутренним устройством .NET, а также тем, 
кто стремится улучшить свои приложения, сделать их оптимальнее. С ростом популярности облачных вычислений вопросы оптимизации (и в конечном счете 
экономии денег) будут все более актуальны.
Российское сообщество .NET-разработчиков DotNet.Ru с удовольствием трудилось над этой книгой, чтобы достичь наивысшего качества перевода и позволить 
читателям погрузиться в мир сборки мусора и работы с памятью. Желаем приятного и полезного чтения!

Над переводом работали представители сообщества DotNet.Ru:
Игорь Лабутин
Ирина Ананьева
Максим Шошин
Елизавета Голенок
Евгений Биккинин
Ренат Тазиев
Анатолий Кулаков

Каста авторов книг неизменно пользуется особым вниманием со стороны 
участников на технических конференциях. Доклады этих людей отличаются глубокой проработкой и широкими взглядами. Ведь за плечами у них рукописи, на 
подготовку которых уходят годы. Это позволяет не только насладиться качественными презентациями, но и провести несколько часов вместе с автором над обсуждением интересных идей.
Типичным представителем прекрасного докладчика, глубокого специалиста, 
внимательного автора и является Конрад Кокоса. Благодаря невероятной тяге 
к исследованиям в столь узкой и сложной области мы получили шанс насладиться 
этим фундаментальным трудом. Десятилетия разработчики воспринимали сборщик мусора как волшебный ящик. Что порождало немало мифов и заблуждений. 
Конрад стал первым автором, который не только смог понять тонкости работы 
этого сложнейшего компонента, но и замечательно систематизировал полученные знания, снабдив наработки великолепными схемами.
Эта книга – незаменимое пособие для разработчиков, интересующихся производительностью программ, а также архитектурой сложных, нестандартных систем. Заложенные здесь знания будут еще долгие годы давать пищу для экспериментов и материал для новых докладов.

Анатолий Кулаков,
член программного комитета конференции DotNext

Об авторе

Конрад Кокоса – опытный проектировщик и разработчик программного обеспечения, интересующийся прежде всего технологиями корпорации Майкрософт, но 
с любопытством поглядывающий и по сторонам. Он программирует уже больше 
десяти лет, занимаясь решением проблем производительности и архитектурными 
головоломками в мире .NET, проектирует и повышает быстродействие приложений. Является независимым консультантом, ведет блог на сайте http://tooslowexception.com, выступает с докладами на встречах по интересам и на конференциях, 
фанатеет от Твиттера (@konradkokosa). Он также отдается своей страсти к преподаванию в области .NET, особенно в части повышения производительности приложений, хорошего стиля кодирования и диагностики. Основатель варшавской 
группы по производительности веб-приложений. Имеет звание Microsoft MVP 
в категории «Visual Studio и средства разработки». Сооснователь сайта Dotnetos.
org, созданного тремя любителями .NET, организующими туры и конференции, 
посвященные производительности в .NET.

О технических рецензентах

Дамьен Фоггон – разработчик, писатель и технический рецензент, работающий 
в области передовых технологий, внес вклад более чем в 50 книг по .NET, C#, Visual Basic и ASP.NET. Сооснователь базирующейся в Ньюкасле группы пользователей NEBytes (адрес в интернете http://www.nebytes.net), сертифицированный профессионал Майкрософт во многих номинациях, начиная с .NET 2.0. Ведет блог по 
адресу http://blog.fasm.co.uk.
Маони Стивенс – архитектор и главный разработчик сборщика мусора в .NET, работает в Майкрософт. Ведет блог по адресу https://blogs.msdn.microsoft.com/maoni/.

Благодарности

Во-первых, хочу очень, очень сильно поблагодарить свою жену. Без ее поддержки 
эта книга никогда не появилась бы на свет. Начиная работу над книгой, я даже 
представить не мог, каким количеством совместно проведенных часов придется 
пожертвовать. Спасибо тебе за терпение, поддержку и ободрение, которые ты дарила мне на протяжении всего этого времени!
Во-вторых, я хочу выразить благодарность Маони Стивенс за развернутые, точные и бесценные замечания к первым вариантам рукописи. Без тени сомнения 
могу утверждать, что благодаря ей книга стала лучше. А то, что ведущий разработчик сборки мусора в .NET помогала при написании этой книги, – само по себе награда для меня! Большое спасибо и другим членам команды .NET, принимавшим 
участие в рецензировании некоторых частей книги, привлечь которых удалось 
при помощи Маони. Перечисляю их в соответствии с количеством вложенного 
труда: Стивен Тоуб (Stephen Toub), Джаред Парсонс (Jared Parsons), Ли Калвер (Lee 
Culver), Джош Фри (Josh Free), Омар Тофик (Omar Tawfik). Спасибо также Марку 
Пробсту (Mark Probst) из компании Xamarin, который отредактировал замечания об исполняющей среде Mono. Особая благодарность Патрику Дассуду (Patrick 
Dussud), «отцу .NET GC», за то, что он нашел время отрецензировать исторический 
обзор создания CLR.
В-третьих, я признателен Дамьену Фоггону, техническому редактору от издательства Apress, который вложил столько труда в редактирование всех глав. Его 
бесценный опыт авторской и издательской деятельности помог сделать изложение более понятным и последовательным. Не раз и не два я поражался точности 
комментариев и предложений Дамьена!
Очевидно, что я благодарен всему коллективу издательства Apress, без которого книга вообще не вышла бы в свет. Отдельное спасибо Лауре Берендсон (редактор-консультант), Нэнси Чен (редактор-координатор) и Джоан Маррей (старший 
редактор), которые поддерживали меня и терпели бесконечные переносы сроков. 
В течение какого-то периода даже само упоминание даты сдачи окончательного 
варианта в наших разговорах было под запретом! Я также благодарен Гвенан Спиринг, с которой начинал работать над книгой, но не смог закончить, потому что 
она ушла из Apress.
Я очень благодарен сообществу .NET в Польше и во всем мире за идеи, которые черпал из многочисленных презентаций, статей и постов, за ободрение 
и поддержку и бесконечные вопросы о том, как продвигается книга. Особенно 
я признателен следующим лицам (перечислены в алфавитном порядке): Мачей 
Анисерович (Maciej Aniserowicz), Аркадиуш Бенедикт (Arkadiusz Benedykt), Себастьян Гебский (Sebastian Gębski), Михал Гжегоржевский (Michał Grzegorzewski), 
Якуб Гутковский (Jakub Gutkowski), Павел Климчик (Paweł Klimczyk), Шимон Кулец (Szymon Kulec), Павел Лукашик (Paweł Łukasik), Алисия Мусяу (Alicja Musiał), 
Лукаш Ольбромский (Łukasz Olbromski), Лукаш Пыржик (Łukasz Pyrzyk), Бартек 
Сокыл (Bartek Sokуł), Себастьян Солница (Sebastian Solnica), Павел Срочиньский 
(Paweł Sroczyński), Ярек Стадницкий (Jarek Stadnicki), Пётр Стапп (Piotr Stapp), 

Благодарности  17

Михал Сливонь (Michał Śliwoń), Шимон Варда (Szymon Warda) и Артур Винченчак 
(Artur Wincenciak), все обладатели звания MVP, и многие другие. Искренне прошу 
прощения у тех, кого не упомянул, огромное спасибо всем, кто в этом нуждается. 
Перечислить всех просто невозможно. Все вы вдохновляли и поддерживали меня.
Хочу также поблагодарить всех опытных авторов, которые нашли время, чтобы поделиться советом о том, как писать книги, в том числе Тэда Ньюэрда (Ted 
Neward) (http://blogs.tedneward.com/) и Джона Скита (Jon Skeet) (https://codeblog.jonskeet.uk), хотя готов побиться об заклад, что они сами этих разговоров не помнят! 
Анджей Кшивда (Andrzej Krzywda) (http://andrzejonsoftware.blogspot.com) и Гынваэль Кольдвинд (Gynvael Coldwind) (https://gynvael.coldwind.pl) также дали мне много советов по написанию и публикации книги.
Далее я благодарю создателей всех тех замечательных инструментов и библиотек, которыми пользовался при написании этой книги: Андрея Щелкина, 
автора SharpLab (https://sharplab.io), Андрея Акиньшина, автора BenchmarkDotNet (https://benchmarkdotnet.org), и Адама Ситника, отвечающего за ее сопровождение, Сергея Теплякова, автора ObjectLayoutInspector (https://github.com/SergeyTeplyakov/ObjectLayoutInspector), 0xd4d, анонимного создателя dnSpy (https://
github.com/0xd4d/dnSpy), Сашу Голдштейна, автора множества полезных инструментов (https://github.com/goldshtn), а также создателей таких великолепных программ, как PerfView и WinDbg (и их расширений, относящихся к .NET).
Я очень признателен своему бывшему работодателю Банку Миллениум, который оказывал мне помощь и поддержку, когда я только приступал к написанию 
книги. Наши пути разошлись, но я всегда буду помнить, что именно там я начал 
писать, вести блог и выступать с докладами. Большое спасибо всем моим тогдашним коллегам за ободрение и вопросы «как продвигается книга?» – это здорово 
мотивирует.
Еще раз спасибо всем анонимным пользователям Твиттера, которые откликались на мои обзоры книг и подсказывали, что интересно, полезно и ценно для 
нашей семьи .NET, а что – не очень.
И наконец, общее спасибо всей моей семье и друзьям, которым я не мог уделять 
достаточно внимания, пока был занят книгой.

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