OutOfMemory, но никакой gcroots для многих объектов

Приложение удерживается от использования Кэшем. Если Вам нужно что-то с областью действия приложения, то необходимо или создать ее как статический член класса или использовать Кэш. Если Вы хотите пойти путем Кэша, но никогда не хотите, чтобы он истек, необходимо использовать CacheItemPriority. Опция NotRemovable, когда Вы Вставляете значение в кэш. Обратите внимание, что возможно использовать этот приоритет и все еще использовать зависимости от кэша, например, если Ваши данные зависели от чего-то в файловой системе. Весь CacheItemPriority делает, предотвращают HttpRuntime. Кэш от интеллектуальной очистки объекта, когда это чувствует давление памяти и использует его Последний использованный алгоритм для чистки объектов, которые не видят много использования.

11
задан grepfruit 11 October 2009 в 11:31
поделиться

4 ответа

Как обычно, оказалось немного иначе. Мы нашли вариант использования, когда приложение действительно потребляло много памяти и в конечном итоге перешло на OOM. Что было странным в дампах, которые мы получили до того, как мы обнаружили это, так это то, что было много объектов без gcroot - я не понимал, почему он не был освобожден и не использован для нового распределения? Затем мне пришло в голову то, что, вероятно, произошло, когда произошло OOM - стек был размотан, и объекты, которым принадлежала память, больше не были доступны, и ТОГДА был выполнен дамп. Вот почему казалось, что много памяти можно было собрать.

То, что я сделал в отладочной версии - чтобы получить реальный дамп памяти, - это создать Threading.Timer, который проверяет, может ли быть выделен какой-то достаточно большой объект - если это возможно не выделяется, это показатель того, что мы приближаемся к OOM и что сейчас самое время сделать дамп памяти. Следующий код:

private static void OomWatchDog(object obj)
{
 try                          
 {
   using(System.Runtime.MemoryFailPoint memFailPoint = 
          new System.Runtime.MemoryFailPoint(20))
   {
   }
 }
 catch (InsufficientMemoryException)
 {
   PerformDump();
 }
}
2
ответ дан 3 December 2019 в 10:44
поделиться

LOH подвержен фрагментации. Эта статья содержит анализ и основные направления работы.
Может быть, вы могли бы опубликовать какой-нибудь код, показывающий "типичное" использование этих байтовых [] буферов?

4
ответ дан 3 December 2019 в 10:44
поделиться

Иногда Image.FromFile («файл без изображения») выдает исключение OutOfMemoryException. Файл с нулевым байтом - это один из таких файлов.

1
ответ дан 3 December 2019 в 10:44
поделиться

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

bp mscorwks! Gc_heap :: allocate_large_object "! Clrstack; .echo ********* Выделение кучи больших объектов ***********; g "

1
ответ дан 3 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: