Файл: Clr компиляция исходного кода в управляемые модули.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 08.11.2023
Просмотров: 41
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
И на этапе чистки в зависимости от необходимости компактинга может производится обновление ссылок и компактинг или удаление без перемещений.
3. Ссылочный тип располагается в куче. Значимый на стеке. Наверняка многие слышали эти определения очень часто.
Но мало того, что это лишь частичная правда, так и определять понятия через протекшую абстракцию — не лучшая идея.
За всеми определениями предлагаю обращаться к стандарту CLI — ECMA 335. Для начала стоит уточнить, что типы описывают значения.
Так, ссылочный тип определяется следующим образом — значение, описываемое ссылочным типом (ссылка) указывает на расположение другого значения.
Для значимого типа значение им описываемое является автономным(самосодержащим). Про то, где располагаются те или иные типы ни слова.
Это является протекшей абстракцией, которую все же следует знать.
Значимый тип может располагаться:
1. В динамической памяти (куче), если он является частью объекта, расположенного в куче, или в случае упаковки;
2. На стеке, если он является локальной переменной/аргументом/возвращаемым значением метода;
Если в структуре, объявлен класс, то структура находится на стеке, а сам экземпляр класса ссыдается на кучу.
разделение памяти на стек и кучу является чисто логическим, физически никакой разницы между областями памяти под кучу и под стек нет.
Разницу в производительнсти обеспечивает уже конкретно работа с этими областями.
4. Финализатор
Финализатор. По своей сути является страховкой. Вызывается неявно, в неопределенное время, во время сборки мусора.
Замедляет выделение памяти, работу сборщика мусора, продлевает время жизни объектов минимум до следующей сборки, а то и дольше,
но зато вызывается сам, даже если его никто не вызывал. Из-за своей недетерминированной природы, в нем должны освобождаться только
неуправляемые ресурсы. Также можно встретить примеры, в которых финализатор применялся для воскрешения(resurrection) объекта и
организации пула объектов таким образом. Однако такая имплементация пула объектов — однозначно плохая идея. Как и пытаться логировать,
кидать исключения, обращаться к базе и тысячи подобных действий.
Сборщик мусора управляет выделением и освобождением памяти для приложения
Указатель следующего объекта
Для простоты, как только создается управляемая куча, она содержит указатель на адрес памяти
, где будет размещен следующий объект. Этот указатель представляет собой просто число и называется следующим указателем объекта . Первоначально его значение равно базовому адресу управляемой кучи:
Как только первый ссылочный объект должен быть выделен в этой конкретной куче, память выделяется в том месте, на которое в данный момент указывает указатель следующего объекта. Состояние кучи после первого выделения будет примерно таким:
Как показано выше, указатель следующего объекта перемещается по адресу сразу после выделенного объекта. Это гарантирует отсутствие ненужных пробелов памяти в куче.
На самом деле значение следующего указателя объекта является числом в шестнадцатеричном формате (например , 0xF7279 ).
может быть запущена сборка мусора, является то, что «память, используемая объектами в управляемой куче, превышает некоторый определенный порог». На самом деле это не один порог (порог определяется в момент запуска программы и ограничивается физической памятью), а несколько порогов. Точнее, отдельное на поколение. Как только размер всех объектов в конкретном поколении превышает пороговое значение, начинается сбор.
Вначале значения порогов для каждого поколения инициализируются следующими значениями:
поколение 0: 256К.,
поколение 1: 2 МБ,
поколение 2: 10 МБ.
Тем не менее, это только начальные значения, которые корректируются сборщиком мусора во время выполнения. Одним из условий увеличения определенного порогового значения является высокий коэффициент выживаемости в поколении (больше объектов из определенного поколения либо переходят в следующее поколение, либо остаются в поколении 2), что снижает частоту циклов сборки мусора ( условие превышения порога выполняется не так часто).
Тем не менее, это только начальные значения, которые корректируются сборщиком мусора во время выполнения. Одним из условий увеличения определенного порогового значения является высокий коэффициент выживаемости в поколении (больше объектов из определенного поколения либо переходят в следующее поколение, либо остаются в поколении 2), что снижает частоту циклов сборки мусора ( условие превышения порога выполняется не так часто).
POH куча закреплённых объектов.
переменные ссылочного типа передаются в методы не посылке, а поля и свойства передаються по ссылке внезависимо, значимого они типа или нет.
Но если передавать объект с помощью ref или out то обект передаётся по ссылке.