Почему куча больших объектов может увеличиваться, а не вызывать исключение?

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

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


person Unsliced    schedule 28.05.2010    source источник


Ответы (2)


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

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

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

person Jack    schedule 28.05.2010

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

person Flory    schedule 03.06.2010