.NET из исключения памяти-используется 1.3 GB, но установлен 16GB

Я получаю исключение из памяти в моем приложении c#, когда использование памяти для приложения превышает 1,3 ГБ.

У меня была такая же проблема на 32-битной машине с 3 ГБ памяти, и это имело смысл тогда, но теперь я обновил оборудование до 64-битной машины с 16 ГБ памяти с высококачественной материнской платой и ОЗУ, но исключение из памяти все еще происходит после 1.3 ГБ!

Я знаю, что нет ни одного объекта более 2 ГБ и 1,3 меньше в любом случае 2GB, поэтому встроенный предел MS 2GB для одного объекта вряд ли будет проблемой...

похоже, что есть какой-то переключатель Windows, когда приложение достигает определенного порога использования памяти... Тогда должен быть способ настроить это в реестре, возможно?

любая помощь будет высоко оценили!

6 ответов


нет никакой разницы, пока вы не compile к той же целевой архитектуре. Я!--12-->предположим вы компилируете для 32 битовая архитектура в обоих случаях.

стоит отметить, что OutOfMemoryException также может быть поднят, если вы получите 2GB памяти, выделенной одной коллекцией в CLR (скажем List<T>) на обеих архитектурах 32 и 64 немного.

чтобы иметь возможность извлечь выгоду из память добра на 64 бит архитектуры, вы должны compile ваш код таргетинга 64 битной архитектурой. После этого, естественно, ваш двоичный файл будет работать только on 64 бит, но выиграет от возможности иметь больше свободного места в ОЗУ.


как уже упоминалось, компиляция приложения в x64 дает вам гораздо больше доступной памяти.

но в случае, если необходимо создать приложение в x86, есть способ повысить лимит памяти с 1,2 ГБ до 4 ГБ (что является фактическим пределом для 32-битных процессов):

в папке VC / bin каталога установки Visual Studio должен быть . Поэтому в моей установке по умолчанию я нахожу его под

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe

для того, чтобы программа работала, возможно, вы должен выполнить vcvars32.bat сначала в том же каталоге. Потом

editbin /LARGEADDRESSAWARE <your compiled exe file>

достаточно, чтобы ваша программа использовала 4GB RAM. <your compiled exe file> является exe, который VS генерируется при компиляции вашего проекта.

если вы хотите автоматизировать это поведение каждый раз при компиляции проекта, используйте следующее событие после сборки для выполненного проекта:

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
   call "$(DevEnvDir)..\tools\vsvars32.bat"
   editbin /largeaddressaware "$(TargetPath)"
)

Sidenote: то же самое можно сделать с devenv.exe чтобы Visual Studio также использовала 4 ГБ ОЗУ вместо 1,2 ГБ (но сначала резервное копирование старого devenv.exe).


стоит отметить, что по умолчанию для компиляции "любого процессора" теперь установлен флажок "предпочитайте 32bit". Будучи установленным в AnyCPU, на 64-битной ОС с 16GB ОЗУ все еще может попасть в исключение из памяти на 2gb, если это проверено.

Prefer32BitCheckBox


похоже, у вас есть 64-битная арка, отлично , но 32-битная версия среды выполнения .NET и / или 32-битная версия Windows.

и как таковой, доступного адресного пространства процесса все та же, она не изменилась от предыдущей установки.

обновить и 64бит ОС и 64бит .Чистая версия ;)


ваше приложение работает как процесс 64 или 32bit? Вы можете проверить это в диспетчере задач.

Это может быть, он работает как 32bit, даже если вся система работает на 64bit.

Если 32bit, сторонняя библиотека может быть причиной этого. Но сначала убедитесь, что ваше приложение компилируется для "любого процессора", как указано в комментариях.


этот метод не работает без настройки.

  1. выполнить запрос cmd.exe (важно : Запуск от имени администратора)
  2. введите команду bcdedit.exe и запустите
  3. посмотрите на" increaseuserva " params и нет затем написать следующее заявление
  4. bcdedit / set increaseuserva 3072
  5. и снова Шаг 2 и проверьте params

мы добавили эти настройки, и этот блок начал.

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
   call "$(DevEnvDir)..\tools\vsvars32.bat"
   editbin /largeaddressaware "$(TargetPath)"
)