Excepción de falta de memoria de .NET: Usó 1.3GB pero tiene 16GB instalados

Recibo una excepción de falta de memoria en mi aplicación c # cuando el uso de memoria para la aplicación supera los 1.3 GB.

Tuve el mismo problema en una máquina de 32 bits con 3 gb de memoria y tenía sentido en aquel entonces, pero ahora actualicé el hardware a una máquina de 64 bits con 16 GB de memoria con la placa madre de gama alta y la memoria RAM pero sin memoria. ¡la excepción todavía ocurre después de 1.3GB!

Sé que no hay objetos únicos de más de 2 GB y 1,3 menos los 2 GB de todos modos, por lo que el límite de MS 2GB incorporado en un solo objeto no es probable que sea el problema …

Parece que hay un interruptor de interrupción de Windows de algún tipo cuando una aplicación alcanza cierto umbral de uso de memoria … ¿Entonces debería haber una forma de configurar esto en el registro quizás?

¡Cualquier ayuda será apreciada!

No hay diferencia hasta que compile en la misma architecture de destino. Supongo que está comstackndo para la architecture de 32 bits en ambos casos.

Vale la pena mencionar que OutOfMemoryException también se puede OutOfMemoryException si obtiene 2GB de memoria asignada por una sola colección en CLR (por ejemplo, List ) en ambas architectures de 32 y 64 bits.

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

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

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

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

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

Para que el progtwig funcione, tal vez vcvars32.bat debe ejecutar vcvars32.bat en el mismo directorio. Entonces un

editbin /LARGEADDRESSAWARE

es suficiente para que su progtwig use 4GB de RAM. es el exe, que VS generó al comstackr su proyecto.

Si desea automatizar este comportamiento cada vez que comstack 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: Lo mismo se puede hacer con devenv.exe para permitir que Visual Studio también use 4GB de RAM en lugar de 1.2GB (pero primero devenv.exe copia de seguridad del antiguo devenv.exe ).

Vale la pena mencionar que el valor predeterminado para una comstackción ‘Cualquier CPU’ ahora marca la checkbox ‘Preferir 32 bits’. Al establecerse en AnyCPU, en un sistema operativo de 64 bits con 16 gb de memoria RAM todavía puede golpear una excepción de falta de memoria en 2 gb si está marcada.

Prefer32BitCheckBox

Parece que tiene un arco de 64 bits, bien, pero una versión de 32 bits del tiempo de ejecución .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 SO de 64 bits y una versión .NET de 64 bits;)

¿Tu aplicación se ejecuta como un proceso de 64 o 32 bits? Puede verificar esto en el administrador de tareas.

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

Si es de 32 bits, una biblioteca de terceros podría estar causando esto. Pero primero asegúrese de que su aplicación comstack para “Cualquier CPU”, como se indica en los comentarios.

Este método no funciona sin seguir las configuraciones.

  1. Ejecute el comando cmd.exe (importante: Ejecutar como administrador)
  2. tipo bcdedit.exe y ejecutar
  3. Mire los parametros “increaseuserva” y no hay más que escribir el siguiente enunciado
  4. bcdedit / set increaseuserva 3072
  5. y de nuevo el paso 2 y verificar params

Agregamos esta configuración y este bloque comenzó.

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