Исключение OutOfMemory

  1. Каковы возможные причины OutofMemory исключения.

  2. Распределение памяти должно обрабатываться сборщиком мусора.

  3. Сколько памяти выделено/доступно для обычного приложения .NET/C#

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

Среда — .Net C#


person Buzz    schedule 26.10.2009    source источник
comment
Во-первых, хотя бы упомяните об окружающей среде (если таковая имеется), о которой идет речь. По крайней мере, .Net и Java имеют исключение OOM. Во-вторых, 2) это даже не корректный вопрос. Что ты спрашиваешь? Голосование за закрытие.   -  person sleske    schedule 26.10.2009
comment
1) Envoirment - это .Net C# 2) почему этот вопрос не подходит   -  person Buzz    schedule 26.10.2009
comment
Ну и вопрос 1) вопрос, но настолько общий, что толком на него и нет содержательного ответа. 2) не вопрос, и 3) должен как минимум получить вопросительный знак. Пожалуйста, постарайтесь использовать правильную пунктуацию и орфографию, и, самое главное, дайте некоторый контекст.   -  person sleske    schedule 26.10.2009
comment
Попробуйте прочитать catb.org/~esr/faqs/smart-questions.html , хоть и длинноват, но довольно хорошо объясняет, как задавать осмысленные вопросы. Стоит прочитать.   -  person sleske    schedule 26.10.2009


Ответы (4)


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

  1. новый объект
  2. новый
  3. коробка

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

person bashmohandes    schedule 26.10.2009

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

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

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

person Mongus Pong    schedule 26.10.2009
comment
сколько памяти доступно для приложения, как я могу это проверить? - person Buzz; 26.10.2009
comment
В 32-разрядной версии Windows (до Win7) существует жесткое ограничение в 2 ГБ виртуальной памяти (3 ГБ с определенным переключателем). 64-разрядная версия Windows может поддерживать 8 ТБ (7 ТБ на Itanic). Фактическая память, к которой вы можете получить доступ до сбоя выделения, может варьироваться. - person Robert Fraser; 10.12.2009

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

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

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

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

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

person Mike Two    schedule 26.10.2009

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

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

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

person Rod    schedule 26.10.2009