2011-04-16 5 views
6

Tenemos una aplicación C++ ejecutándose en el sistema de 32 bits de Windows. Se bloquea una vez que el uso de memoria alcanza 1.5 GB. Lo que no podemos entender es por qué está fallando a un límite de 1.5 GB y no a un límite de 2 GB (el espacio de direcciones virtuales y el límite de arquitectura de 32 bits de Windows).La aplicación C++ se bloquea una vez que el uso de memoria alcanza 1.5 GB

Otros detalles: - de memoria total disponible: 4 GB

Sistema operativo: Windows XP

1,5 GB es la memoria utilizada por sólo este proceso.

Saludos,

Sachin

+1

Estoy tratando de averiguar por qué alguna vez tendrías una aplicación que usa 1.5GB de memoria ... Estoy dibujando un espacio en blanco. (P.S. Estoy seguro de que su aplicación no es lo único que se está ejecutando en ese momento) –

+0

¿Cuánta memoria tiene el sistema en total? ¿Qué versión de Windows? – jonsca

+0

1.5GB es el uso de memoria de qué: ¿el único proceso o todo el sistema? –

Respuesta

9

Esto es perfectamente normal en Windows de 32 bits.

A menos que tenga activado el modificador/3gb, tiene un espacio total de direcciones de 2 GB. Sin embargo, eso es menos el ejecutable mapeado y al menos media docena de archivos DLL y NLS (para "hello world" - una aplicación real probablemente tendría más de una docena o dos docenas de ellos).

Dado que no están en una posición óptima, se pierde aproximadamente medio gigabyte de espacio de direcciones. El montón no crecerá "en" esa región y, por lo tanto, la asignación de más de 1,5 GB fallará.

Esto es lo que el espacio de direcciones de un "programa típico" se parece a:

enter image description here

Nota cuán hábilmente una DLL se coloca aproximadamente a 1/3 del espacio de direcciones, de manera efectiva "cortar "un tercio de la memoria que puedes usar.

+1

Buena respuesta y puntos de bonificación para la captura de pantalla. Sería útil si incluyese un enlace a (o al menos el nombre de) la utilidad que utilizó para capturar un gráfico de la fragmentación del espacio de direcciones. –

+0

Eso es VMMap: http://technet.microsoft.com/en-us/sysinternals/dd535533 – Damon

4

La fragmentación de la memoria virtual podría ser una razón.

Una razón más posible es cómo los administradores de memoria (grupos de memoria) suelen funcionar. El administrador de memoria intenta reservar un bloque de memoria 2 veces más que el anterior. Cuando ya se asigna bastante memoria, esta cantidad será muy grande y una asignación de memoria fallará a pesar de que en realidad todavía hay memoria disponible.

+0

Además de la fragmentación, ¿puede otra fábrica afectar esto? Este bloqueo es bastante coherente con ese límite de memoria de 1,5 GB. Lo hemos probado corriendo varias veces. – sachin

+0

@sachin: la fragmentación es causada en parte por direcciones base de DLL, que tienden a ser bastante consistentes. Eso podría explicar por qué 1,5 GB es tan repetible para usted. –

+0

He estado buscando en Google este problema. Uno puede encontrar varias consultas donde las aplicaciones se cuelgan alrededor de 1.5 GB de uso de memoria. ¿Puede haber algunas configuraciones específicas del sistema operativo que obliguen a un límite de 1.5 gb (y no a un límite de 2 gb de Windows XP) o es solo una coincidencia? – sachin

0

Puede habilitar el dr. watson como depurador predeterminado y ver si un volcado de emergencia puede ser atrapado, luego abre el volcado con Visual Studio o Windbg y puedes ver la pila de llamadas antes del bloqueo, y luego saber cuál es la causa real del bloqueo.

Cuestiones relacionadas