Почему "Куча" для больших объектов могла бы вырастить, а не выдать исключение?

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

Почему можно было бы звонить в, например, StringBuilder. EnsureCapacity бросают OutOfMemoryException для меня, но другой вызов от где-то в другом месте результата в LOH, расширяющемся в размере (согласно счетчикам производительности, это растет и уменьшается)?

1
задан Community 23 May 2017 в 10:24
поделиться

2 ответа

я не уверен, но я бы попробовал 2 способа:

  1. проверить выделенную неуправляемую память в вашем приложении и использовать метод GC.AddMemoryPressure, чтобы сказать memorymanagment обрабатывать это лучше.
  2. использовать класс MemoryFailPoint перед большими вызовами выделения. там у вас есть шанс избежать большого бума в вашем приложении. освободите некоторые ресурсы и попробуйте снова.

edit: 3-й способ может заключаться в создании дополнительных appdomains и обработке больших вещей в этих дополнительных appdomains.

2
ответ дан 3 September 2019 в 00:15
поделиться

Я просмотрел исходную статью и разместил там то, что, по моему мнению, может быть вашей проблемой. Пойдите, проверьте это.

0
ответ дан 3 September 2019 в 00:15
поделиться
Другие вопросы по тегам:

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