Управление памятью в .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
Содержание 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, а что – не очень. И наконец, общее спасибо всей моей семье и друзьям, которым я не мог уделять достаточно внимания, пока был занят книгой.
Доступ онлайн
В корзину