Under the Hood of .NET Memory Management / Под капотом у памяти в .Net: Chapter 2: The Simple Heap Model
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Та, которая была простой для понимания, и которую вы хорошо поняли? Теперь давайте забудем о ней (я вас предупреждал), потому что отныне нам нужно думать о SOH с точки зрения трех поколений объектов. masterofsea147 10.12.19 в 09:27 |
|
|
Когда объект создается, он классифицируется как объект нулевого поколения, это означает, что он новый и еще не проверен GC. masterofsea147 10.12.19 в 09:33 |
||
|
Объекты первого поколения были проверены GC один раз и выжили, а объекты второго поколения пережили две или более таких проверок (не забывайте, о том, что сборщик мусора позволяет объекту оставаться в памяти только в том случае, если он имеет корневую ссылку). masterofsea147 10.12.19 в 09:38 |
||
|
GC автоматически запускается в отдельном потоке при выполнении одного из следующих условий: masterofsea147 10.12.19 в 09:41 |
||
|
Следует иметь в виду, что вышеуказанные пороговые значения являются просто начальными уровнями, поскольку .NET изменяет их в зависимости от поведения приложения. masterofsea147 10.12.19 в 09:43 |
||
|
Итак, теперь давайте посмотрим, что происходит, когда GC запускается от каждого из поколений. masterofsea147 10.12.19 в 09:44 |
+1 | |
|
Нулевое поколение объектов masterofsea147 20.11.19 в 05:52 |
||
|
Объекты нулевого поколения еще не подвергались сборке мусора. У них есть два возможных исхода, после нее: masterofsea147 10.12.19 в 09:54 |
+1 | |
|
В любом случае, в результате сборки мусора нулевое поколения становится пустым, а все корневые объекты(имеющие корневую ссылку) из нулевого поколения переходят в первое, присоединяясь к его остальным объектам . Помните, в процесс сборки нулевого поколения, существующие объекты первого остаются нетронутыми masterofsea147 10.12.19 в 10:00 |
||
|
После сборки мусора нулевое поколение всегда остается пустым masterofsea147 20.11.19 в 05:53 |
||
|
Первое поколение объектов masterofsea147 20.11.19 в 05:54 |
||
|
Сборка первого поколения собирают объекты первых двух поколений. Опять же, чтобы проиллюстрировать, давайте посмотрим на результат сборки мусора по состоянию кучи на рисунке 2.4. masterofsea147 10.12.19 в 10:04 |
||
|
На этот раз объект X вместо того чтобы, оставаться в первом поколении, перемещается во второе(в конце концов, теперь он пережил сборку мусора). Объект Y перемещается из нулевого поколения в первое, как и раньше, и объект Z удаляется. Нулевое поколение становится пустым. masterofsea147 10.12.19 в 10:07 |
||
|
Второе поколение объектов masterofsea147 20.11.19 в 05:07 |
||
|
Сборка второго поколения также известна как "Full" сборка, потому что все поколения проверяются и собираются. Она выполняет наибольшую работу и, следовательно, является самой дорогостоящей. masterofsea147 10.12.19 в 10:11 |
||
|
Кстати, если вы беспокоитесь о том, почему объект W выживал все это время, тогда вы можете перестать беспокоиться, потому что он вот-вот умрет. masterofsea147 10.12.19 в 10:13 |
||
|
Как видно на рисунке 2.7, сборка второго поколения приводит к следующему: masterofsea147 10.12.19 в 10:16 |
+1 | |
|
Очевидно, что в этом случае GC пришлось выполнить большее количество работы, чем в любой из предыдущих сборок мусора. В идеале, вам бы хотелось, чтобы объекты попадали во второе поколение, только если им крайне необходимо там быть. Второе поколение - дорогостоящее место для хранения ваших объектов, и слишком частые сборки второго поколения могут сильно ухудшить производительность. masterofsea147 10.12.19 в 10:24 |
||
|
Основное правило заключается в том, что сборки нулевого поколения должны производиться в десять раз чаще, чем сборки первого поколения, и в сто раз чаще чем сборки второго поколения. masterofsea147 10.12.19 в 10:27 |
||
|
Последствия для производительности masterofsea147 06.12.19 в 02:41 |
||
|
Я имею в виду, что до тех пор, пока в процессе сборок нулевого поколения из памяти удаляется много объектов (помните, что это относительно дешевый процесс), в следующие поколения их попадает меньше, и поэтому производительность остается высокой. Итак, в идеальном мире подавляющее большинство ваших объектов должно умереть в нулевом, или, возможно, masterofsea147 12.12.19 в 07:33 |
||
|
Объекты, которые попадают во второе поколение, должны делать это по определенной причине; наверное потому что это многократно используемые объекты, которые более эффективно создавать единожды и сохранять, чем пересоздавать каждый раз. masterofsea147 12.12.19 в 07:35 |
||
|
Финализация masterofsea147 20.11.19 в 05:07 |
||
|
Любой неуправляемый ресурс, доступный из .NET, не будет очищен GC и поэтому продолжит существовать. masterofsea147 20.11.19 в 05:57 |
||
|
Финализация конец masterofsea147 12.12.19 в 06:25 |
||
|
Куча больших объектов masterofsea147 20.11.19 в 05:55 |
||
|
До этого момента мы рассматривали SOH, но объекты размером более 85 КБ размещаются в куче больших объектов (LOH). В отличие от SOH, к объектам в LOH не применяется сжатие так как на их перемещение в памяти masterofsea147 12.12.19 в 06:49 |
||
|
На рисунке 2.10 изображены два свободных пространства, которые были заняты объектами, оставшимися без корневой ссылки. После сборки мусора второго поколения их диапазоны адресов были просто записаны в таблицу свободного пространства. masterofsea147 12.12.19 в 06:51 |
