Исключение OutOfMemory - PullRequest
       19

Исключение OutOfMemory

5 голосов
/ 26 октября 2009
  1. Каковы возможные причины исключения OutofMemory.

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

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

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

Среда .Net C #

Ответы [ 4 ]

7 голосов
/ 26 октября 2009

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

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

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

2 голосов
/ 26 октября 2009

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

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

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

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

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

2 голосов
/ 26 октября 2009

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

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

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

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

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

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

...