2009-10-26 23 views
5
  1. ¿Cuáles son los posibles motivos de la excepción OutofMemory?Excepción OutOfMemory

  2. Las asignaciones de memoria deben ser manejadas por GC.

  3. ¿Cuánta memoria se asigna/Disponible para aplicación normal .NET/C#

En nuestra aplicación que viene en diferentes lugares como Stream.ReadToEnd() y DataTable.WriteXml(Memory stream) función.

medio ambiente es .Net C#

+1

En primer lugar, como mínimo mencione el entorno (si corresponde) de lo que se trata su pregunta. Al menos .Net y Java tienen una excepción OOM. En segundo lugar, 2) esta ni siquiera es una pregunta adecuada. ¿Que estas preguntando? Votando para cerrar. – sleske

+0

1) Enveloment es .Net C# 2) por qué esta pregunta no es correcta – Buzz

+0

Bien, pregunta 1) una pregunta, pero tan general que realmente no tiene una respuesta significativa. 2) no es una pregunta, y 3) debería al menos obtener un signo de interrogación. Por favor, intente utilizar la puntuación y la ortografía adecuadas, y lo más importante, dar un contexto. – sleske

Respuesta

7

El OutOfMemory exception sucede cada vez que una llamada a cualquiera de las siguientes instrucciones MSIL no

  1. newobj
  2. newarr
  3. cuadro

Que básicamente la operación s que asignan nueva memoria en el montón, en su caso, Stream.ReadToEnd aparentemente asigna una matriz de bytes internamente para cargar la secuencia en la memoria, por lo que si el archivo es lo suficientemente grande como para interrumpir el proceso arrojará esta excepción.

1
  1. Digamos que tiene un máximo de 10 MB de memoria para usar en su aplicación. Crea una nueva lista y agrega instancias de objeto. Digamos ahora que cada instancia de objeto "pesa" 1MB. Por lo tanto, las 10 primeras instancias se agregarán sin problemas, pero la undécima instancia arrojará OutOfMemoryException, ya que después de las primeras 10 instancias se utilizó toda la memoria asignada (10 MB).

  2. El recolector de elementos no utilizados busca "Basura", instancias que no se van a utilizar - Que CANT se puede utilizar ya que ninguna otra instancia está apuntando a ellos. En el caso, por ejemplo, tener un miembro de instancia de tipo Lista con instancias que contienen, el GC no recopilará la Lista ni sus instancias. Siga añadiendo instancias a la lista de posibles y aumentadas con OutOfMEmory Exception.

Utilice los siguientes argumentos de VM si quieres/necesidad de aumentar la memoria utilizada por la aplicación: Java youAppName -Xms128m -Xmx512m

2

O se está utilizando más memoria que la aplicación tiene a su disposición . En este caso, tendrá que averiguar cómo hacer que su uso de memoria sea más eficiente. Es posible que sea necesario el uso de Archivos/Base de datos para almacenar datos que no esté utilizando inmediatamente.

O bien, tiene una pérdida de memoria. En ese caso, debe considerar eliminar las referencias a la memoria cuando ya no las esté usando para que el GC pueda liberar la memoria.

Si está utilizando C# o .Net, puede utilizar el CLR Profiler para analizar su memoria y ver cómo se está utilizando. CLR Profiler

+0

cuánta memoria hay disponible para la aplicación, ¿cómo puedo verificar eso? – Buzz

+0

En Windows de 32 bits (anterior a Win7), hay un límite estricto de 2 GB en la memoria virtual (3 GB con un determinado interruptor). Windows de 64 bits puede admitir 8TB (7TB en Itanic). La memoria real a la que puede acceder antes de una falla de asignación puede variar. –

2

O bien su aplicación ha agotado la memoria disponible o tiene un problema con la fragmentación del montón.

En el primer caso, ha creado suficientes objetos para ocupar toda la memoria y todavía tiene referencias para que el recolector de basura no pueda limpiarlos.

En el segundo caso, la fragmentación del montón, está intentando crear un objeto que es más grande que el fragmento contiguo más grande de la memoria en el montón. Esto es más raro, pero ciertamente sucede en algunos casos. El montón normal se compactará durante las ejecuciones de gc, pero el montón de objetos grandes no lo hará.

Hay un buen article en MSDN sobre el gran montón de objetos.

Editar: Recordé otra forma de salir de la memoria. Puede intentar y crear un objeto que tenga más de 2 GB de tamaño. Ese es el tamaño máximo de objeto en .NET incluso en 64 bits.

Cuestiones relacionadas