2009-06-02 11 views
8

Mi PC tiene 2 GB de memoria RAM. Cuando formulo un objeto de malla 3D con una matriz de 70,000 elementos en C# 2008 Express Edition, recibo el mensaje de error "Excepción de desbordamiento de pila manejada ...". Si actualizo la memoria RAM de 2 GB a 4 GB, ¿puedo superar este mensaje de error?¿Puede la actualización de memoria de 2 GB a 4 GB evitar las excepciones de desbordamiento de pila?

+10

1 por un desbordamiento de pila pregunta sobre el desbordamiento de la pila. Me dio la risa. Para –

+5

una pregunta relacionada, consulte aquí: ;-P stackoverflow.com/questions/941952 –

+2

Es broma ... aquí (en realidad, esta vez): http://stackoverflow.com/questions/656226/ –

Respuesta

11

No. El aumento de RAM no aumenta el tamaño de la pila.

Está escribiendo un código que está causando el desbordamiento de la pila (quizás debido a la recursión) y tendrá que solucionarlo.

+3

De hecho; la recursión infinita es la más probable. +1 –

19

Casi seguro no. Un desbordamiento de la pila (en lugar de una falta de memoria) significa que ha consumido el espacio asignado pila, pero la pila es (hablando relativamente) pequeña. El montón es donde todo está sucediendo ...

Opciones:

  • arreglar su error bucle infinito ...
  • mover los datos en un// Lista de algún almacén basado en heap gama (¿dónde está en este momento?)
  • evitar recursión profunda
  • evitar estructuras sobredimensionadas ... ¿tienes algunas estructuras gordas que realmente deberían ser clases? (las estructuras se copian a sí mismas si las parpadea)
  • aumente el espacio de la pila si está seguro de que solo lo está volcando, y no vale la pena un refactorio grande (odio esta respuesta) - para hacer esto necesitaría engendrar su propio hilo con una pila más grande
+0

Nota: Esta respuesta podría interpretarse como que aumentar la memoria RAM física aumentará el tamaño del almacenamiento dinámico, que no es el caso. –

+0

Ciertamente lo hará, al menos en un sistema de 64 bits? –

+0

El punto clave es que tiene muy poco efecto en la pila, pero (a pesar de los límites de 2 GB/3 GB de x86) todavía existe una relación entre la memoria RAM física y la memoria de proceso disponible. –

2

Probablemente no. Debe increase the stack size, eso es lo que dice el mensaje de error

Editar: O arregle la recursión infinita que probablemente tenga en su código.

2

Un desbordamiento de pila puede significar una recursión infinita O una muy anidada.

Incidentemente, si tiene métodos recursivos de cola, el x64 JITter los optimizará y no se ejecutará en desbordamientos de pila en absoluto (y su recursión infinita será ... bien infinita).

por lo que podría actualizar a un sistema operativo de 64 bits, o fijar su código a fin de no entrar en este problema (que es más probable un error de un muy profundo recursividad anidado ...)

+0

¿Cómo es que esto solo funciona en x64? – SamB

3

memoria física sólo influye el rendimiento de los programas que se ejecutan en la máquina, pero no tiene nada que ver con ningún problema relacionado con la memoria de un programa (en los sistemas operativos estándar, el sistema incrustado sigue reglas diferentes).

En primer lugar, porque he visto este error muchas veces, hablemos del modelo de memoria del sistema operativo.

Casi todos los sistemas operativos de los usuarios (estoy pensando aquí en linux, windows, bsd, etc.) utilizan un modelo de memoria virtual. El modelo de memoria virtual significa que cada programa tiene acceso completo a una memoria virtual privada, es decir, una representación del almacenamiento de memoria que no tiene que tener la memoria física correspondiente.

El tamaño de esta memoria virtual es igual a la gama que puede ser dirigida por un único registro de la máquina. En sistemas operativos de 32 bits, eso significa aproximadamente 4 GB. Ahora, independientemente de la cantidad de memoria que tenga su sistema, su programa siempre pensará que tiene 4 GB.

Ahora, esos 4 GB son, de hecho, compartidos entre su programa y el espacio que el sistema operativo reserva para manejar datos en modo kernel, así como para mantener las estructuras necesarias para su programa. Siendo práctico, puede contar con aproximadamente 2 o 3 GB dependiendo de su configuración (su configuración de sistema operativo). Todo esto no tiene nada que ver con la cantidad de memoria física que tiene, puede tener 256 MB de RAM y su programa pensará que tiene 2 GB a su disposición.

Al asignar memoria, el sistema generalmente no proporciona exactamente la cantidad de memoria que pide. En su lugar, utiliza páginas, que son bloques de memoria reservada (por ejemplo, 4 KB) asignados a su proceso. Cuando hace eso, el sistema operativo registra esa "página" como asignada, pero esto todavía está en la memoria virtual. Internamente, el sistema operativo administra qué páginas se guardan en la memoria física y cuáles de ellas están en el intercambio (en el HDD). Esa es la razón por la que aumentar su RAM aumenta su rendimiento (más páginas pueden estar en la memoria principal al mismo tiempo, y debe leer menos desde el HDD) pero no ayuda con un desbordamiento de pila (o una excepción de Falta de memoria por la manera).

Y eso por qué aumentar su RAM no ayudará.

Por último, sobre la excepción de desbordamiento de pila ... Bueno, es difícil decir sin ver el código real, ya se han dado algunas buenas respuestas.

En su mayoría, el desbordamiento de pila proviene de una recursión infinita, ya sea directa o indirecta (A -> B -> C -> A) pero en su caso concreto, diría que solo está asignando mucha información en la pila.

Tiene una matriz de 70000 tamaños. Supongo que la matriz está llena de tipos de valores, que se asignan en la pila y que, si recuerdo correctamente (y no lo tomo como un hecho), es de 1 MB en .NET, que podría ser la razón por la que está recibiendo tu pila se desbordó

1

En realidad, no. Pero tengo una razón diferente: Windows XP solo puede manejar hasta 2 GB a menos que especifique una opción de arranque específica en boot.ini. (El parámetro/3gb). En el mejor de los casos, Windows XP y Vista llegarán a 3 GB de RAM y ese es básicamente el límite para Windows. Consulte This link para obtener más información acerca de estos límites.

El aumento de la memoria RAM y la fijación de su aplicación a ir más allá del límite de 2 GB podría arreglar su desbordamiento de pila, ya que podría aumentar el tamaño de su pila. También podría retrasar el momento del desbordamiento de la pila, ya que, como se ha sugerido, el código está en un ciclo recursivo sin fin y continuará ejecutándose hasta que se agoten los recursos.

Si usted hace uso de la recursividad, tenga esto en cuenta: cualquier cosa que lo hace mediante el uso de la recursividad puede ser reescrita sin el uso de la recursividad. No hay excepciones a esta regla, aunque el código no será más fácil de leer.

+1

En realidad, el indicador/3Gb cambia la cantidad máxima de memoria por proceso que se puede asignar. Windows XP y Vista tomarán felizmente 4Gb de RAM pero solo permitirán el acceso a aproximadamente 3.5Gb de él, con los restantes 500Mb de espacio direccionable tomado para otra memoria como tarjetas de video, etc. –

+0

Cierto, pero desde la perspectiva de la aplicación la aplicación aún estará limitada a 3 GB. Actualizar a 4 GB significa menos intercambio pero no más memoria para su proceso en sí. –

0

No sé para C#, pero en Java, significa error stackoverflow que va a crear instancia de una clase en la clase que ya han sido ejemplificada en la clase que usted está tratando de ejemplo

Cuestiones relacionadas