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

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

Хотя в .NET управление памятью осуществляется автоматически, понимание того, как именно это делается, сулит немало преимуществ. Вы сможете писать более качественные программы, эффективно взаимодействующие с памятью. Книга содержит 25 сценариев поиска и устранения неисправностей, призванных помочь в диагностике сложных проблем при работе с памятью. Приводится также ряд полезных рекомендаций по написанию кода, учитывающих особенности управления памятью и позволяющих избежать типичных ошибок. Книга адресована разработчикам программного обеспечения для платформы .NET, архитекторам и специалистам по производительности.

Author(s): Конрад Кокоса
Publisher: ДМК Пресс
Year: 2020

Language: Russian
Pages: 799
City: Москва

_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
Пользовательский сборщик мусора
Резюме
Предметный указатель