Исключение .NET Out of Memory-используется 1,3 ГБ, но установлено 16 ГБ


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

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

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

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

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

6 74

6 ответов:

нет никакой разницы, пока вы не compile к той же целевой архитектуре. Я предположим вы компилируете для 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>

достаточно, чтобы ваша программа использовала 4 ГБ оперативной памяти. <your compiled exe file> - это исполняемый файл, который против, который создается во время компиляции проекта.

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

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

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

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

Prefer32BitCheckBox

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

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

обновление до 64-битной ОС и 64-битной версии .NET;)

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

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

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

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

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

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

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