Сборка "мусора" в.NET [закрытые] (поколения)

Я прочитал много статей производительности.NET, которые описывают Gen1, сборку "мусора" Gen2 и объекты, переживающие поколения.

То, почему делает объекты, переживает набор?

Что прикрепляет?

22
задан cs95 19 July 2019 в 05:25
поделиться

3 ответа

Предполагая, что у вас есть NHibernate 2.1 Alpha3, скопируйте LinFu.DynamicProxy.dll и NHibernate.ByteCode.LinFu.dll из \ Required_For_LazyLoading \ LinFu в вашу корзину (или ссылки)

Тогда ваша строка конфигурации должна работать:

<add key="proxyfactory.factory_class" value="NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu" />

В стороне, я предпочитаю блок раздела hibernate-configuration для конфигурации.

Изменить: Вот соответствующие разделы из моей веб-конфигурации, если вы хотите настроить hibernate-configuration вместо пар ключ / значение.

Кроме того, можно просто поместить hibernate-configuration ] в собственном файле с именем hibernate.cfg.xml . Затем вы можете использовать xsd nhibernate-configuration.xsd , который находится в загрузке, для проверки вашей конфигурации. Здесь тоже полезно задавать вопросы:)

На ваши вопросы:

Почему объекты выживают в коллекции:
Объекты выживают в коллекции, если они являются «живыми объектами» или «достижимыми объектами». Доступные объекты - это объекты, на которые есть ссылка из другого объекта, который находится в:

  1. Стек
  2. Очередь финализации
  3. другой объект в более высоком поколении (например, объект Gen2, содержащий ссылку на Gen0 Object)
  4. Таблица дескрипторов (структура данных, используемая CLR и требующая отдельного поста :))

Что такое закрепление:
Закрепление означает, что объект не перемещается в памяти . объекты перемещаются в памяти в результате уплотнения GC, вы можете создать GCHandle с типизированным закреплением, если вы хотите закрепить объект,

10
ответ дан 29 November 2019 в 04:47
поделиться

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

0
ответ дан 29 November 2019 в 04:47
поделиться

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

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

Когда объект выживает в коллекции, он передается более долгоживущему поколению, исходя из теории, что если он выжил в одной коллекции, то, вероятно, переживет другие. Таким образом, у более поздних поколений текучесть кадров меньше, и они не так сильно фрагментируются. Это означает, что ваша программа тратит меньше времени на то, чтобы убрать дыры, и тратить меньше памяти. Это также улучшение по сравнению с традиционным управлением памятью (malloc / free или new / delete), которое оставляло на усмотрение операционной системы управление любой фрагментацией памяти.

Причина, по которой объект выживает в коллекции, заключается в том, что где-то есть что-то, что все еще "в области видимости" и содержит ссылку на этот объект. Есть несколько способов вызвать это, а затем забыть о ссылке, что может привести к «утечке» памяти в управляемом коде.

Иногда возникает соблазн вызвать GC.Collect () ], чтобы заставить сборщик мусора что-то очистить. Возможно, они обнаружили утечку данных или думают, что память становится чрезмерно фрагментированной. Вы должны сопротивляться этим побуждениям. Хотя сборка мусора в .Net не идеальна, она очень хороша и почти наверняка намного лучше очищает память, чем вы. Скорее всего, если объект можно и нужно собрать, он будет. Помните, что вызов GC.Collect () может на самом деле ухудшить ситуацию, помогая сборщику мусора перемещать объекты до более высокого поколения и, таким образом, удерживать их дольше, чем они могли бы быть в противном случае.

Вместо этого, если вы подозреваете, что произошла утечка, посмотрите в своем собственном коде что-то вроде глобальной или статической переменной, которая может содержать ссылку на множество других элементов. Единственный раз, когда вы должны вызывать GC.Collect () , - это когда у вас есть информация о природе программы, которая недоступна сборщику мусора, а это довольно редко, поскольку GC знает каждую ссылку, которую вы ' ve created.

«Закрепление» используется, когда вам нужно передать объект в неуправляемую библиотеку. Сборщик мусора может перемещать физическое местоположение объекта в памяти, поэтому вам нужно «закрепить» его в одном месте, иначе указатель, используемый неуправляемой библиотекой, может стать недействительным. Прикрепленный объект не может быть собран, поэтому вы не должны прикреплять объект дольше, чем необходимо.

30
ответ дан 29 November 2019 в 04:47
поделиться