Under the Hood of .NET Memory Management / Под капотом у памяти в .Net: Chapter 2: The Simple Heap Model

Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Та, которая была простой для понимания, и которую вы хорошо поняли? Теперь давайте забудем о ней (я вас предупреждал), потому что отныне нам нужно думать о SOH с точки зрения трех поколений объектов.

masterofsea147 10.12.19 в 09:27

0

Когда объект создается, он классифицируется как объект нулевого поколения, это означает, что он новый и еще не проверен GC.

masterofsea147 10.12.19 в 09:33

0

Объекты первого поколения были проверены GC один раз и выжили, а объекты второго поколения пережили две или более таких проверок (не забывайте, о том, что сборщик мусора позволяет объекту оставаться в памяти только в том случае, если он имеет корневую ссылку).

masterofsea147 10.12.19 в 09:38

0

GC автоматически запускается в отдельном потоке при выполнении одного из следующих условий:
• Когда размер объектов в любом поколении достигает порогового значения для конкретного поколения. Чтобы быть точным, когда:
• Нулевое поколение достигает ~ 256 KБ
• Первое поколение достигает ~ 2 МБ (в этот момент сборщик мусора собирает 1 и 0 поколения)
• Второе поколение достигает ~ 10 МБ (в этот момент сборщик мусора собирает 2, 1 и 0 поколения)
• GC.Collect () вызывается в коде
• ОС отправляет уведомление о нехватке памяти.

masterofsea147 10.12.19 в 09:41

0

Следует иметь в виду, что вышеуказанные пороговые значения являются просто начальными уровнями, поскольку .NET изменяет их в зависимости от поведения приложения.

masterofsea147 10.12.19 в 09:43

0

Итак, теперь давайте посмотрим, что происходит, когда GC запускается от каждого из поколений.

masterofsea147 10.12.19 в 09:44

0
+1

Нулевое поколение объектов

masterofsea147 20.11.19 в 05:52

0

Объекты нулевого поколения еще не подвергались сборке мусора. У них есть два возможных исхода, после нее:
• перейти к первому поколению (если они имеют корневую ссылку в своей иерархии)
• умереть и быть уплотненным (если они не имеют корневых ссылок и поэтому более не используются).

masterofsea147 10.12.19 в 09:54

0
+1

В любом случае, в результате сборки мусора нулевое поколения становится пустым, а все корневые объекты(имеющие корневую ссылку) из нулевого поколения переходят в первое, присоединяясь к его остальным объектам . Помните, в процесс сборки нулевого поколения, существующие объекты первого остаются нетронутыми

masterofsea147 10.12.19 в 10:00

0

После сборки мусора нулевое поколение всегда остается пустым

masterofsea147 20.11.19 в 05:53

0

Первое поколение объектов

masterofsea147 20.11.19 в 05:54

0

Сборка первого поколения собирают объекты первых двух поколений. Опять же, чтобы проиллюстрировать, давайте посмотрим на результат сборки мусора по состоянию кучи на рисунке 2.4.

masterofsea147 10.12.19 в 10:04

0

На этот раз объект X вместо того чтобы, оставаться в первом поколении, перемещается во второе(в конце концов, теперь он пережил сборку мусора). Объект Y перемещается из нулевого поколения в первое, как и раньше, и объект Z удаляется. Нулевое поколение становится пустым.

masterofsea147 10.12.19 в 10:07

0

Второе поколение объектов

masterofsea147 20.11.19 в 05:07

0

Сборка второго поколения также известна как "Full" сборка, потому что все поколения проверяются и собираются. Она выполняет наибольшую работу и, следовательно, является самой дорогостоящей.

masterofsea147 10.12.19 в 10:11

0

Кстати, если вы беспокоитесь о том, почему объект W выживал все это время, тогда вы можете перестать беспокоиться, потому что он вот-вот умрет.

masterofsea147 10.12.19 в 10:13

0

Как видно на рисунке 2.7, сборка второго поколения приводит к следующему:
• Объект W умирает и уплотняется
• Объект X перемещается во второе поколение
• Объект Y перемещается в первое поколение
• Объект Z умирает и уплотняется.

masterofsea147 10.12.19 в 10:16

0
+1

Очевидно, что в этом случае GC пришлось выполнить большее количество работы, чем в любой из предыдущих сборок мусора. В идеале, вам бы хотелось, чтобы объекты попадали во второе поколение, только если им крайне необходимо там быть. Второе поколение - дорогостоящее место для хранения ваших объектов, и слишком частые сборки второго поколения могут сильно ухудшить производительность.

masterofsea147 10.12.19 в 10:24

0

Основное правило заключается в том, что сборки нулевого поколения должны производиться в десять раз чаще, чем сборки первого поколения, и в сто раз чаще чем сборки второго поколения.

masterofsea147 10.12.19 в 10:27

0

Последствия для производительности

masterofsea147 06.12.19 в 02:41

0

Я имею в виду, что до тех пор, пока в процессе сборок нулевого поколения из памяти удаляется много объектов (помните, что это относительно дешевый процесс), в следующие поколения их попадает меньше, и поэтому производительность остается высокой. Итак, в идеальном мире подавляющее большинство ваших объектов должно умереть в нулевом, или, возможно,
в первом поколении.

masterofsea147 12.12.19 в 07:33

0

Объекты, которые попадают во второе поколение, должны делать это по определенной причине; наверное потому что это многократно используемые объекты, которые более эффективно создавать единожды и сохранять, чем пересоздавать каждый раз.

masterofsea147 12.12.19 в 07:35

0

Финализация

masterofsea147 20.11.19 в 05:07

0

Любой неуправляемый ресурс, доступный из .NET, не будет очищен GC и поэтому продолжит существовать.

masterofsea147 20.11.19 в 05:57

0

Финализация конец

masterofsea147 12.12.19 в 06:25

0

Куча больших объектов

masterofsea147 20.11.19 в 05:55

0

До этого момента мы рассматривали SOH, но объекты размером более 85 КБ размещаются в куче больших объектов (LOH). В отличие от SOH, к объектам в LOH не применяется сжатие так как на их перемещение в памяти
потребуется слишком много процессорного времени. При выполнении полной сборки мусора диапазоны адресов любых неиспользуемых объектов LOH записываются в таблицу «свободного пространства». Если какие-либо смежные объекты из LOH не имеют корня их диапазоны адресов складываются и только после этого помещаются в таблицу.

masterofsea147 12.12.19 в 06:49

0

На рисунке 2.10 изображены два свободных пространства, которые были заняты объектами, оставшимися без корневой ссылки. После сборки мусора второго поколения их диапазоны адресов были просто записаны в таблицу свободного пространства.

masterofsea147 12.12.19 в 06:51

0
Минутку...

← Предыдущая страница

Следующая страница →