Я выхожу здесь на конечность и замечу, что в сделанных предположениях есть что-то подозрительное. Прежде всего, зачем вы пишете такой код? На самом деле обычно для приложения не хватает памяти, а это , почему вы хотите отобразить использование памяти в вашем пользовательском интерфейсе? Во-вторых, как вы уверены, что приложение на самом деле использует только 150 МБ, если это происходит в производственной среде, но не на вашем компьютере разработчика?
Я утверждаю, что исключение реально, а предположения неверны. Процесс фактически исчерпал память. То, что это произошло внутри кода, который был разработан для предупреждения пользователя о нехватке памяти, очень иронично. Но, конечно, это не невозможно, нативной функции ОС, которая предоставляет информацию, нужен довольно большой буфер, когда на машине запущено много процессов. Вместо этого вы должны были использовать свойство Environment.WorkingSet.
Также примечательно, что получить 150 МБ из WorkingSet и получить OOM вполне возможно. Это неправильная статистика памяти. WorkingSet описывает, сколько оперативной памяти вы используете. Но OOM срабатывает, когда у вас заканчивается виртуальная память . Две очень разные меры. WorkingSet низок, когда страницы виртуальной памяти выгружаются в файл подкачки. Что, скорее всего, произойдет, когда запущено множество процессов, конкурирующих за оперативную память.
Нет удобного свойства для измерения размера виртуальной машины. Главным образом, потому что это в значительной степени бесполезно, размер отверстий на карте памяти является тем, что важно. Вы получаете OOM, когда нет достаточно большого отверстия, чтобы соответствовать распределению. Если вы хотите отобразить полезную статистику, тогда GC.GetTotalMemory () несколько полезен. Только несколько, это не учитывает неуправляемую память в использовании. Решите все свои проблемы, указав в своих требованиях 64-разрядную операционную систему.