Я получаю исключение нехватки памяти в моем приложении C #, когда использование памяти для приложения превышает 1,3 ГБ.
У меня была такая же проблема на 32-разрядной машине с 3 ГБ памяти, и тогда это имело смысл, но теперь я обновил оборудование до 64-разрядной машины с памятью 16 ГБ с высокопроизводительной материнской платой и оперативной памятью, но Out Of Memory исключение все еще происходит после 1,3 ГБ!
Я знаю, что нет отдельных объектов размером более 2 ГБ, а 1.3 в любом случае меньше 2 ГБ, поэтому встроенный предел MS 2 ГБ для одного объекта вряд ли будет проблемой ...
Похоже, что есть какой-то выключатель Windows, когда приложение достигает определенного порога использования памяти ... Тогда должен быть способ настроить это, возможно, в реестре?
Любая помощь будет оценена!
источник
Ответы:
Нет никакой разницы, пока вы не скомпилируете ту же целевую архитектуру. Я полагаю, вы компилируете для
32
битовой архитектуры в обоих случаях.Стоит упомянуть, что
OutOfMemoryException
это также может быть увеличено, если вы получаете2GB
память, выделенную одной коллекцией в CLR (скажемList<T>
) как на архитектурах, так32
и на64
битах.Чтобы получить выгоду от качества памяти в
64
битовой архитектуре, вы должны скомпилировать свой код, ориентированный на64
битовую архитектуру. После этого, естественно, ваш двоичный файл будет работать только на64
бит, но выиграет от возможности иметь больше места в ОЗУ.источник
Как уже упоминалось, компиляция приложения в x64 дает вам гораздо больше доступной памяти.
Но в случае, если нужно создать приложение на x86, есть способ поднять ограничение памяти с 1,2 ГБ до 4 ГБ (что является фактическим пределом для 32-битных процессов):
В папке VC / bin установочного каталога Visual Studio должен быть
editbin.exe
файл. Итак, в моей установке по умолчанию я нахожу его вC:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe
Для того, чтобы программа работала, возможно, вы должны
vcvars32.bat
сначала выполнить ее в том же каталоге. Затемeditbin /LARGEADDRESSAWARE <your compiled exe file>
достаточно, чтобы ваша программа использовала 4 ГБ ОЗУ.
<your compiled exe file>
это exe, который VS сгенерировал при компиляции вашего проекта.Если вы хотите автоматизировать это поведение каждый раз при компиляции проекта, используйте следующее событие Post-Build для выполняемого проекта:
if exist "$(DevEnvDir)..\tools\vsvars32.bat" ( call "$(DevEnvDir)..\tools\vsvars32.bat" editbin /largeaddressaware "$(TargetPath)" )
Примечание: то же самое можно сделать с помощью
devenv.exe
Visual Studio, чтобы также использовать 4 ГБ ОЗУ вместо 1,2 ГБ (но сначала сделайте резервную копию старогоdevenv.exe
).источник
Стоит отметить, что по умолчанию для компиляции «Любой процессор» теперь установлен флажок «Предпочитать 32-битный». Если установлено AnyCPU, в 64-битной ОС с 16 ГБ ОЗУ все равно может возникнуть исключение нехватки памяти на 2 ГБ, если это отмечено.
источник
Похоже, у вас 64-битная арка, хорошо, но 32-битная версия среды выполнения .NET и / или 32-битная версия Windows.
Таким образом, адресное пространство, доступное для вашего процесса, остается прежним, оно не изменилось по сравнению с предыдущей настройкой.
Выполните обновление до 64-битной ОС и 64-битной версии .NET;)
источник
Ваше приложение работает как 64- или 32-битный процесс? Вы можете проверить это в диспетчере задач.
Может быть, он работает как 32-битный, хотя вся система работает на 64-битном.
Если 32-битный, это может быть сторонняя библиотека. Но сначала убедитесь, что ваше приложение компилируется для «Any CPU», как указано в комментариях.
источник
Если у вас 32-битная Windows, этот метод не работает без следующих настроек.
Мы добавили эти настройки, и этот блок начался.
if exist "$(DevEnvDir)..\tools\vsvars32.bat" ( call "$(DevEnvDir)..\tools\vsvars32.bat" editbin /largeaddressaware "$(TargetPath)" )
Подробнее - команда
increaseuserva
: https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/bcdedit--setисточник