Excepción. NET Fuera de memoria: Se usa 1.3 GB pero se han instalado 16 GB


Estoy recibiendo una excepción Fuera de memoria en mi aplicación c# cuando el uso de memoria para la aplicación supera aproximadamente 1.3 GB.

Tuve este mismo problema en una máquina de 32 bits con 3 gb de memoria y tenía sentido en ese entonces, pero ahora actualizé el hardware a una máquina de 64 bits con 16 GB de memoria con la placa base de alta gama y RAM, pero la excepción de falta de memoria todavía se produce después de 1.3 GB!

Sé que no hay objetos individuales de más de 2 GB y 1.3 es menos de 2 GB de todos modos, por lo tanto, el límite de MS 2GB incorporado en un solo objeto no es probable que sea el problema...

Parece que hay un interruptor de apagado de Windows de algún tipo cuando una aplicación alcanza un cierto umbral de uso de memoria... Entonces debería haber una manera de configurar esto es en el registro tal vez?

Cualquier ayuda será muy apreciada!

Author: Paceman, 2013-01-07

6 answers

No hay diferencia hasta que compile a la misma arquitectura de destino. I supongamos que está compilando para 32 arquitectura de bits en ambos casos.

Vale la pena mencionar que OutOfMemoryException también puede ser planteado si usted get 2GB de memoria asignada por una sola colección en CLR (dicen List<T>) en ambas arquitecturas 32 y 64 bits.

Para poder beneficiarse de la bondad de la memoria en la arquitectura de bits 64, debe compila tu código apuntando a la arquitectura de bits 64. Después de eso, naturalmente, su binario se ejecutará solo en el bit 64, pero se beneficiará de la posibilidad de tener más espacio disponible en RAM.

 81
Author: Tigran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-05 14:23:33

Como ya se mencionó, compilar la aplicación en x64 le da mucha más memoria disponible.

Pero en el caso de que uno debe construir una aplicación en x86, hay una manera de aumentar el límite de memoria de 1,2 GB a 4 GB (que es el límite real para procesos de 32 bits):

En la carpeta VC/bin del directorio de instalación de Visual Studio, debe haber un archivo editbin.exe. Así que en mi instalación por defecto lo encuentro bajo

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe

Para hacer que el programa funcione, tal vez deba ejecutar vcvars32.bat en el el mismo directorio primero. Entonces un

editbin /LARGEADDRESSAWARE <your compiled exe file>

Es suficiente para permitir que su programa use 4 GB de RAM. <your compiled exe file> es el exe, que VS generado durante la compilación de su proyecto.

Si desea automatizar este comportamiento cada vez que compile su proyecto, use el siguiente evento Post-Build para el proyecto ejecutado:

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
   call "$(DevEnvDir)..\tools\vsvars32.bat"
   editbin /largeaddressaware "$(TargetPath)"
)

Nota lateral: Lo mismo se puede hacer con el devenv.exe para permitir que Visual Studio también use 4 GB de RAM en lugar de 1.2 GB (pero primero haga una copia de seguridad del antiguo devenv.exe).

 56
Author: Desty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-08 17:34:50

Vale la pena mencionar que el valor predeterminado para una compilación 'Cualquier CPU' ahora marca la casilla de verificación 'Prefer 32bit'. Al estar configurado en AnyCPU, en un sistema operativo de 64 bits con 16 gb de RAM aún puede golpear una excepción de falta de memoria a 2 gb si está marcada.

Prefer32BitCheckBox

 15
Author: tonycoupland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-27 12:06:17

Parece que tiene un arco de 64 bits, bien but pero una versión de 32 bits del tiempo de ejecución de.NET y/o una versión de 32 bits de Windows.

Y como tal, el espacio de direcciones disponible para su proceso sigue siendo el mismo, no ha cambiado desde su configuración anterior.

Actualice a un sistema operativo de 64 bits y a una versión. NET de 64 bits;)

 2
Author: fge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-06 20:14:08

¿Su aplicación se está ejecutando como un proceso de 64 o 32 bits? Puede comprobar esto en el administrador de tareas.

Podría ser, se está ejecutando como 32bit, a pesar de que todo el sistema se está ejecutando en 64bit.

Si 32bit, una biblioteca de terceros podría estar causando esto. Pero primero asegúrese de que su aplicación está compilando para "Cualquier CPU", como se indica en los comentarios.

 1
Author: Jacco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-06 20:21:46

Este método no funciona sin los siguientes ajustes.

  1. Ejecute el prompt cmd.exe (importante : Ejecutar como Administrador)
  2. tipo bcdedit.exe y run
  3. Mira los parámetros de "increaseuserva" y no hay ninguna declaración siguiente de escribir
  4. bcdedit / set increaseuserva 3072
  5. y de nuevo paso 2 y comprobar parámetros

Agregamos esta configuración y este bloque comenzó.

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
   call "$(DevEnvDir)..\tools\vsvars32.bat"
   editbin /largeaddressaware "$(TargetPath)"
)
 0
Author: Mehmet Kurt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-17 10:37:28