Управление памятью в .NET для профессионалов: написание более качественного, производительного и маштабируемого кода: [перевод]
معرفی کتاب «Управление памятью в .NET для профессионалов: написание более качественного, производительного и маштабируемого кода: [перевод]» نوشتهٔ Конрад Кокоса، منتشرشده توسط نشر ДМК Пресс در سال 2020. این کتاب در فرمت pdf، زبان ru ارائه شده است.
_heading=h.2et92p0 _heading=h.tyjcwt _heading=h.3dy6vkm _heading=h.1t3h5sf _heading=h.4d34og8 _heading=h.2s8eyo1 _heading=h.17dp8vu _heading=h.3rdcrjn _heading=h.35nkun2 _heading=h.2jxsxqh _heading=h.z337ya _heading=h.3j2qqm3 _heading=h.1y810tw _heading=h.4i7ojhp _heading=h.2xcytpi _heading=h.1ci93xb _heading=h.2bn6wsx _heading=h.qsh70q _heading=h.3as4poj _heading=h.1pxezwc _heading=h.49x2ik5 _heading=h.2p2csry _heading=h.147n2zr _heading=h.3o7alnk _heading=h.23ckvvd _heading=h.ihv636 _heading=h.32hioqz _heading=h.1hmsyys _heading=h.41mghml _heading=h.2grqrue _heading=h.vx1227 _heading=h.3fwokq0 _heading=h.1v1yuxt _heading=h.4f1mdlm _heading=h.rsbl7f461140 Об авторе О технических рецензентах Благодарности Предисловие Введение От издательства Основные понятия Терминология, относящаяся к памяти Статическое выделение Регистровая машина Стек Стековая машина Указатель Куча Ручное управление памятью Автоматическое управление памятью Распределитель, модификатор и сборщик Подсчет ссылок Отслеживающий сборщик Этап пометки Этап сборки Немного истории Резюме Правило 1: учиться, учиться и учиться Низкоуровневое управление памятью Оборудование Память Центральный процессор Операционная система Виртуальная память Большие страницы Фрагментация виртуальной памяти Общая структура памяти Управление памятью в Windows Организация памяти в Windows Управление памятью в Linux Организация памяти в Linux Зависимость от операционной системы NUMA и группы процессоров Резюме Правило 2: избегайте произвольного доступа, отдавайте предпочтение последовательному Правило 3: улучшайте пространственную и временную локальность данных Правило 4: пользуйтесь продвинутыми средствами Измерения памяти Измеряйте как можно раньше Накладные расходы и вмешательство Выборка и трассировка Дерево вызовов Графы объектов Статистика Задержка и пропускная способность Дампы памяти, трассировка, динамическая отладка Среда Windows Краткий обзор VMMap Счетчики производительности Трассировка событий для Windows Windows Performance Toolkit PerfView ProcDump и DebugDiag WinDbg Дизассемблеры и декомпиляторы BenchmarkDotNet Коммерческие инструменты Среда Linux Краткий обзор Perfcollect Trace Compass Дампы памяти Резюме Правило 5: измеряйте GC как можно раньше Фундаментальные основы .NET Версии .NET Детали внутреннего устройства .NET Разбираем пример программы Сборки и домены приложений Забираемые сборки Области памяти процесса Сценарий 4.1. Сколько места в памяти занимает моя программа? Сценарий 4.2. Моя программа потребляет все больше и больше памяти Сценарий 4.3. Моя программа потребляет все больше и больше памяти Сценарий 4.4. Моя программа потребляет все больше и больше памяти Система типов Категории типов Хранение типов Типы значений Ссылочные типы Строки Интернирование строк Сценарий 4.5. Моя программа потребляет слишком много памяти Упаковка и распаковка Передача по ссылке Передача по ссылке экземпляра типа значений Передача по ссылке экземпляра ссылочного типа Локальность типов данных Статические данные Статические поля Внутреннее устройство статических данных Резюме Структуры Классы Разделение памяти на части Стратегии разделения памяти Разделение по размеру Куча малых объектов Куча больших объектов Разделение по времени жизни Сценарий 5.1. Как чувствует себя моя программа? Динамика размеров поколений Запомненные наборы (Remembered sets) Таблицы карт (Card tables) Связки карт Физическое разделение Сценарий 5.2. Утечка памяти в nopCommerce? Сценарий 5.3. Растранжиривание кучи больших объектов? Анатомия сегментов и кучи Повторное использование сегментов Резюме Правило 11: следите за размерами поколений Правило 12: избегайте лишних ссылок в куче Правило 13: наблюдайте за использованием сегментов Выделение памяти Введение в распределение памяти Выделение памяти сдвигом указателя Выделение памяти из списка свободных блоков Создание нового объекта Выделение памяти в куче малых объектов Выделение памяти в куче больших объектов Балансировка кучи Исключение OutOfMemoryException Сценарий 6.1. Нехватка памяти Выделение памяти в стеке Избегание выделения памяти Явное выделение памяти для ссылочных типов Скрытое выделение памяти Скрытое выделение памяти в библиотеках Сценарий 6.2. Исследование выделения памяти Сценарий 6.3. Функции Azure Резюме Правило 14: избегайте выделения памяти в куче на критических с точки зрения производительности участках программы Правило 15: избегайте дорогостоящего выделения памяти в LOH Правило 16: по возможности выделяйте память в стеке Сборка мусора – введение Общее описание Пример процесса сборки мусора Шаги процесса сборки мусора Сценарий 7.1. Анализ использования GC Профилирование GC Данные для настройки производительности сборки мусора Статические данные Динамические данные Сценарий 7.2. Демонстрация бюджета выделения Инициаторы сборки мусора Запуск по причине выделения памяти Явный запуск Сценарий 7.3. Анализ явных вызовов GC Запуск по причине нехватки памяти у системы Запуск по различным внутренним причинам Приостановка движка выполнения Сценарий 7.4. Анализ времени приостановки GC Выбор поколения для сборки Сценарий 7.5. Анализ выбираемых поколений Резюме Сборка мусора – этап пометки Обход и пометка объектов Корни – локальные переменные Хранилище локальных переменных Корни на стеке Лексическая область видимости Живые стековые корни и лексическая область видимости Живые стековые корни с ранней сборкой корней Информация для GC (GC Info) Закрепленные локальные переменные Просмотр стековых корней Корни финализации Внутренние корни GC Корни – описатели GC Анализ утечек памяти Сценарий 8.1. Утечка памяти в nopCommerce? Сценарий 8.2. Нахождение самых популярных корней Резюме Сборка мусора – этап планирования Куча малых объектов Заполненные и пустые блоки Сценарий 9.1. Дамп памяти с поврежденными структурами Таблица кирпичей Закрепление Сценарий 9.2. Исследование закрепления Границы поколений Оставление Куча больших объектов Заполненные и пустые блоки Принятие решения об уплотнении Резюме Сборка мусора – очистка и уплотнение Этап очистки Куча малых объектов Куча больших объектов Этап уплотнения Куча малых объектов Куча больших объектов Сценарий 10.1. Фрагментация кучи больших объектов Резюме Правило 17 : следите за приостановкой среды выполнения Правило 18: избегайте кризиса среднего возраста Правило 19: избегайте фрагментации старого поколения и LOH Правило 20: избегайте явной сборки мусора Правило 21: избегайте утечек памяти Правило 22: избегайте закрепления Варианты сборки мусора Обзор режимов Режим рабочей станции и серверный режим Неконкурентный и конкурентный режим Конфигурирование режимов .NET Framework .NET Core Приостановка и накладные расходы GC Описание режимов Неконкурентный режим рабочей станции Конкурентный режим рабочей станции (до версии 4.0) Фоновый режим рабочей станции Неконкурентный серверный режим Фоновый серверный режим Режимы задержки Пакетный режим Интерактивный режим Режим низкой задержки Режим длительной низкой задержки Регион без сборки мусора (No GC Region) Цели оптимизации задержки Выбор варианта GC Сценарий 8.1. Проверка параметров GC Сценарий 8.2. Измерение и тестирование производительности различных режимов GC Резюме Правило 23: выбирайте режим GC обдуманно Правило 24: помните о режимах задержки Время жизни объекта Жизненные циклы объекта и ресурса Финализация Введение Проблема ранней сборки корней Критические финализаторы Внутреннее устройство финализации Сценарий 12.1. Утечка памяти из-за финализации Воскрешение Уничтожаемые объекты Безопасные описатели Слабые ссылки Кеширование Паттерн слабых событий Сценарий 9.2. Утечка памяти из-за событий Резюме Правило 25: избегайте финализаторов Правило 26: отдавайте предпочтение явной очистке Разное Зависимые описатели Локальная память потока Статические поля потока Слоты данных потока Внутреннее устройство локальной памяти потока Сценарии использования Управляемые указатели Ссылочные локальные переменные Возвращаемые ссылочные значения Постоянные ссылочные переменные и in-параметры Внутреннее устройство ссылочных типов Управляемые указатели в C# – ссылочные переменные И снова о структурах Постоянные структуры Ссылочные структуры (byref-подобные типы) Буферы фиксированного размера Размещение объектов и структур в памяти Ограничение unmanaged Непреобразуемые типы Резюме Продвинутые приемы Span и Memory Span Memory IMemoryOwner Внутреннее устройство Memory Рекомендации по работе с Span и Memory Класс Unsafe Внутреннее устройство Unsafe Проектирование, ориентированное на данные Тактическое проектирование Стратегическое проектирование Еще немного о будущем... Ссылочные типы, допускающие null Конвейеры Резюме Интерфейсы прикладного программирования (API) GC API Сведения и статистические данные о сборке мусора Уведомления GC Контроль потребления неуправляемой памяти Явная сборка мусора Области без GC Управление финализацией Потребление памяти Внутренние вызовы в классе GC Размещение CLR ClrMD Библиотека TraceEvent Пользовательский сборщик мусора Резюме Предметный указатель
دانلود کتاب Управление памятью в .NET для профессионалов: написание более качественного, производительного и маштабируемого кода: [перевод]