Почему в приложении C # появляется исключение нехватки памяти?

вы можете использовать флаги формата & nbsp; & nbsp;

http://en.cppreference.com/w/cpp/io/ios_base/fmtflags

29
задан Eddie 28 February 2009 в 17:47
поделиться

6 ответов

В нормальном приложении Windows на 32 бита процесс только имеет 2 ГБ адресуемой памяти. Это не важно на сумму физической памяти, которая доступна.

Так доступные 2 ГБ, но 1.5 макс., которое можно выделить. Ключ - то, что Ваш код не является единственным кодом, работающим в процессе. Другие.5 ГБ являются, вероятно, CLR плюс фрагментация в процессе.

Обновление: в.Net 4.5 в процессе на 64 бита у Вас могут быть большие массивы, если установка gcAllowVeryLargeObjects включена:

На 64-разрядных платформах, включает массивы, которые больше, чем 2 гигабайта (ГБ) в общем размере. Максимальное число элементов в массиве является UInt32. MaxValue.

<configuration>
  <runtime>
    <gcAllowVeryLargeObjects enabled="true" />
  </runtime>
</configuration>
40
ответ дан Alexei Levenkov 28 February 2009 в 17:47
поделиться
  • 1
    I' ll смотрят на DataMapper. Спасибо за пример кода. – Chris Collins 24 April 2009 в 18:41

Просто дополнительный к другим точкам; если Вы хотите получить доступ к грязному объему памяти, рассматриваете x64 - но знаете, что максимум единственный размер объекта - все еще 2 ГБ. И потому что ссылки больше в x64, это означает, что Вы на самом деле становитесь меньшими максимальный размер массива/списка для ссылочных типов. Конечно, к тому времени, когда Вы поражаете тот предел, Вы, вероятно, делаете вещи неправильно так или иначе!

Другие опции:

  • файлы использования
  • используют базу данных

(очевидно, у обоих есть различие в производительности по сравнению с незавершенной памятью)

<час>

Обновление: В версиях.NET до 4,5, максимальный размер объекта составляет 2 ГБ. От 4,5 вперед можно выделить большие объекты, если gcAllowVeryLargeObjects включен. Обратите внимание, что предел для string не затронут, но "массивы" должны покрыть "списки" также, так как списки поддерживаются массивами.

10
ответ дан Marc Gravell 28 February 2009 в 17:47
поделиться
  • 1
    когда Вы используете ' DataMapper.setup (: значение по умолчанию, " sqlite3:: memory") ' это - дб im-памяти? Как Вы сохранили бы это к диску, или как Вы откроете существующий sqlite файл дб? – LoveMeSomeCode 25 August 2010 в 17:06

На 32-разрядной операционной системе Windows максимальная память 'непривилегированного режима', к которой может получить доступ отдельное приложение, составляет 2 ГБ... предполагающих, что у Вас есть 4 ГБ памяти на поле.

Неуправляемый VC ++ Application' s потребление памяти на windows server

http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx

(Это забавно, Вы спросили это, потому что я спросил почти то же самое вчера...)

3
ответ дан Community 28 February 2009 в 17:47
поделиться

У Вас есть макс. из адресуемой памяти на 2 ГБ как приложение на 32 бита как другие упомянутые плакаты. Не забывайте об издержках. Вы создаете массив 93 миллионов объектов - если, оказывается, существует 4 байта издержек на объект, это составляет дополнительные 350 МБ памяти.

4
ответ дан geofftnz 28 February 2009 в 17:47
поделиться

Только добавить к предыдущим ответам: можно пойти вне предела на 2 ГБ на системы, загруженные с/3Gb [и дополнительно userva] флаги начальной загрузки.

5
ответ дан KristoferA 28 February 2009 в 17:47
поделиться

Еще одна вещь, о которой нужно знать; некоторым объектам .NET требуется «непрерывная» память. я.

4
ответ дан 28 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: