2009-10-26 3 views
5
  1. Каковы возможные причины исключения OutofMemory.Исключение OutOfMemory

  2. Отчисления памяти должны обрабатываться GC.

  3. Сколько памяти выделяется/Имеющиеся в наличии для приложения нормальной .NET/C#

В нашем приложении это происходит в разных местах, как Stream.ReadToEnd() и DataTable.WriteXml(Memory stream) функции.

Окружающая среда .Net C#

+1

Во-первых, по крайней мере, упоминание об окружающей среде (если есть), о вашем вопросе. По крайней мере .Net и Java имеют исключение OOM. Во-вторых, 2) это даже не вопрос. Что ты спрашиваешь? Голосование закрывается. – sleske

+0

1) Envoirment is .Net C# 2) почему этот вопрос не является правильным – Buzz

+0

Ну, вопрос 1) вопрос, но настолько общий, что на самом деле он не имеет значимого ответа. 2) не является вопросом, и 3) должен по крайней мере получить знак вопроса. Попробуйте использовать правильную пунктуацию и орфографию, а самое главное, и дайте некоторый контекст. – sleske

ответ

7

OutOfMemory exception происходит всякий раз, когда вызов любой из следующих инструкций MSIL не удается

  1. newobj
  2. newarr
  3. коробка

Что в основном операция s, которые выделяют новую память в куче, в вашем случае Stream.ReadToEnd, по-видимому, выделяет массив байтов внутри, чтобы загрузить поток в память, поэтому, если файл достаточно большой, чтобы разбить процесс, он выкинет это исключение.

1
  1. Допустим, у вас есть максимум 10 МБ памяти для использования в приложении. Вы создаете новый список и добавляете к нему экземпляры экземпляра. Скажем теперь, что каждый экземпляр объекта «вес» 1 МБ. Таким образом, первые 10 экземпляров будут добавлены без проблем, но 11-й экземпляр выкинет OutOfMemoryException, поскольку после первых 10 экземпляров вы использовали всю выделенную память (10 МБ).

  2. Сборщик мусора ищет «Мусор», экземпляры, которые не будут использоваться. Какой CANT использовать, поскольку другие экземпляры не указывают на них. В случае, например, для экземпляра типа List с содержащими экземплярами, GC не будет собирать список или его экземпляры. Продолжайте добавлять экземпляры в список возможно и с OutOfMEmory Exception.

Используйте следующие параметры виртуальной машины, если вы хотите/необходимость увеличить объем памяти, используемый вашим приложением: Java youAppName -Xms128m -Xmx512m

2

Либо вы используете больше памяти, чем приложение имеет в его распоряжении , В этом случае вам нужно будет решить, как повысить эффективность использования вашей памяти. Использование файлов/базы данных для хранения данных, которые могут возникнуть при немедленном использовании, может быть необходимо.

Или у вас есть утечка памяти. В этом случае вам нужно посмотреть на удаление ссылок на память, когда вы больше не используете их, чтобы GC мог освободить память.

Если вы используете C# или .Net, вы можете использовать Profiler CLR для анализа вашей памяти, чтобы узнать, как она используется. CLR Profiler

+0

сколько памяти доступно для приложения, как я могу это проверить? – Buzz

+0

В 32-битной Windows (pre-Win7) жесткий диск 2 ГБ на виртуальной памяти (3 ГБ с определенным переключателем). 64-битная Windows может поддерживать 8TB (7TB на Itanic). Фактическая память, к которой вы можете получить доступ, до отказа распределения может отличаться. –

2

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

В первом случае вы создали достаточно объектов для захвата всей памяти, и у вас все еще есть ссылка на них, чтобы сборщик мусора не мог их очистить.

Во втором случае, фрагментация кучи, вы пытаетесь создать объект, который больше, чем самый большой непрерывный кусок памяти в куче. Это реже, но, конечно, происходит в некоторых случаях. Обычная куча будет уплотняться во время выполнения gc, но большая куча объекта не будет.

В MSDN есть хорошая article о кучке большого объекта.

Редактировать: Я вспомнил еще один способ избавиться от памяти. Вы можете попытаться создать объект размером более 2 ГБ. Это максимальный размер объекта в .NET даже на 64-битном уровне.

Смежные вопросы