Программе с большим объемом памяти, которую я написал, не хватило памяти: возникло исключение OutOfMemory. Во время попыток уменьшить использование памяти я начал вызывать GC.GetTotalMemory (true) (чтобы записать общее использование памяти в файл отладки), что вызывает сборку мусора.
По какой-то причине при вызове этой функции я больше не получаю исключение нехватки памяти. Если я снова удаляю вызовы (оставляя все остальное прежним), исключение выдается снова. В моем понимании, вызовы автоматически создаются для сбора мусора при увеличении нагрузки на память, поэтому я не понимаю этого поведения.
Может кто-нибудь объяснить, почему исключение нехватки памяти выдается только тогда, когда нет вызовов GC.collect?
Обновление:
Я использую VS 2010, но я нацеливаю приложение на фреймворк 3.5. Я считаю, что дефрагментация действительно вызывает мои проблемы.
Я провел несколько тестов: когда генерируется исключение, вызов GC.gettotalmemory говорит мне, что я использую ~ 800 * 10 ^ 6 байт. Тем не менее, диспетчер задач говорит мне, что приложение использует 1700 МБ. Довольно большое расхождение. Сейчас я планирую выделить память только один раз и никогда не освобождать большие массивы, а использовать их повторно. К счастью, моя программа позволяет мне выполнять это без особых хлопот.