Определить лимит для кучи больших объектов программно - PullRequest
1 голос
/ 27 января 2011

Поскольку рекомендуется использовать шаблон IDisposal для больших объектов, мне интересно, почему не существует надежного способа определения предела, с которого объект следует считать «большим»?

Внутренне существует такое различие: нижний предел для объектов, размещаемых на LOH.Всякий раз, когда он сообщается публично как 85k, одному из них одновременно запрещается полагаться на этот номер.

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

Почему нет такой вещи как

GC.GetLOHLimit() 

или даже лучше:

bool GC.ArrayTargetForManualDisposal(Type type, int length); 

Редактировать: Я знаю,Шаблон IDisposable - это всего лишь рекомендация для правильной обработки специальных объектов (например, «больших» или неуправляемых объектов).Мой вопрос не предполагает, будет ли специальная обработка для этих объектов во время выполнения.Я скорее прошу поддержки во время выполнения для разработчиков шаблона (может быть и других), чтобы знать, когда объект должен следовать специальному управлению памятью или нет.

Ответы [ 2 ]

4 голосов
/ 27 января 2011

IDisposable не имеет отношения к управляемому управлению памятью.Удаление объекта - это пользовательское соглашение \ шаблон, оно не используется внутри среды выполнения и не влияет на управление памятью.Среда выполнения не знает IDisposable.Единственная специальная обработка \ распознавание IDisposable - при использовании с ключевым словом using, но это распознается компилятором (по крайней мере, компилятором C #), а не средой выполнения.

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

Если вы заинтересованы в управлении памятью CLR, я бы сначала предложил разобраться с тем, что IDisposable не связано с ним.

3 голосов
/ 27 января 2011

Как сказано в chibacity, IDisposable не связан с управлением LOH.Вот хорошая статья о LOH: Обнаружена куча больших объектов .

При этом, насколько мне известно, не существует публичного API для определения размера LOH.Ссылку на ограничение 85000 байт можно найти в SSCLI"ротор" (источник доступен здесь: Общий язык: версия для общего пользования, версия 2.0, загрузка ):

в clr/src/vm/gc.h:

#define LARGE_OBJECT_SIZE   85000

Хотя этот источник является источником, эквивалентным CLR 2.0, а не CLR 4, я не думаю, что они изменили это, поскольку это, безусловно, будет иметь серьезные последствия длясуществующий код.

Таким образом, если вы хотите сделать что-то умное с этим значением, вы, вероятно, можете безопасно поместить его в константу или сделать его настраиваемым, но оно, безусловно, не изменится динамически в ходе рабочего процесса..

...