2010-04-29 11 views
31

Soy miembro de un equipo que desarrolla una aplicación Delphi. Los requisitos de memoria son enormes. 500 MB es normal, pero en algunos casos salió de la excepción de memoria. La memoria asignada en esos casos es típicamente entre 1000 - 1700 MB.¿Por qué 2 GB de límite de memoria cuando se ejecuta en Windows de 64 bits?

Por supuesto, queremos un compilador de 64 bits, pero eso no sucederá ahora (y si sucede, también debemos convertirlo a unicode, pero esa es otra historia ...).

Mi pregunta es por qué hay un límite de memoria de 2 GB por proceso cuando se ejecuta en un entorno de 64 bits. El puntero es de 32 bits, así que creo que 4 GB sería el límite correcto. utilizo Delphi 2007.

EDIT: Así que si me puse la bandera IMAGE_FILE_LARGE_ADDRESS_AWARE en Delphi usando:

{$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} 

y ejecutar el archivo EXE resultante en un Windows Server 2003 x64 entonces la aplicación puede abordar 4 GB?

  • ¿Debo configurar/3GB cambiar en boot.ini?
  • Hemos intentado esto pero en un Windows Server 2003 de 32 bits y parece limitar los recursos de Windows. Hubo más excepciones para "Sin memoria" con GDIError en el registro. Pero tal vez esto desaparezca cuando se ejecuta en un sistema operativo de 64 bits?
+0

El interruptor de 3 GB en el arranque.ini es solo para Windows de 32 bits, y se requiere para que LARGEADDRESSAWARE funcione. Tenga en cuenta que reduce el espacio disponible para Windows en sistemas de 32 bits. Vea el ejemplo anterior aquí, http://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx, o lea los excelentes internos de Windwos por Russinovoch y Solomon. –

Respuesta

32

Si compila la aplicación Delphi usando la bandera/LARGEADDRESSAWARE, será capaz de hacer frente a la plena 4 GB en un sistema operativo de 64 bits. De lo contrario, cuando se ejecuta en WOW32, el sistema operativo asume que la aplicación espera el mismo entorno que tendría en un sistema operativo de 32 bits, lo que significa que de los 4 GB de espacio de direcciones, 2 GB están dedicados para el sistema operativo y 2 GB están asignados a la aplicación.

+4

Eso solo es válido en 32 bits. No hay diferencia binaria entre un puntero de 3GB y un puntero de 4GB, por lo que cualquier aplicación que pueda manejar 3GB puede hacer 4GB./LARGEADDRESSAWARE es bueno para los sistemas completos de 4GB en 64 bits sin ninguna modificación de arranque. La única vez que tiene que hacer/3GB es si desea usar más espacio de direcciones en un sistema de 32 bits. El artículo que vinculó tiene una antigüedad de diez años y solo se aplica a los sistemas de 32 bits. PAE es un sistema completamente diferente. – Puppy

+0

@Dead: sí, por supuesto en sistemas de 64 bits (http://support.microsoft.com/kb/294418) aunque el artículo original tiene solo 5 años de antigüedad, no 10. :) Sin embargo, la respuesta sigue siendo incorrecta/incompleto con respecto a su discusión de implicaciones en sistemas operativos de 32 bits. – Deltics

+1

@Deltics - LARGEADDRESSAWARE no solo se aplica a 3 GB Eso es absolutamente incorrecto. http://msdn.microsoft.com/en-us/library/wz223b1z%28VS.80%29.aspx. Es una indicación de que la aplicación puede manejar ** CUALQUIERA ** direcciones superiores a 2 GB. Es absolutamente correcto que si desea los 4 GB completos de espacio de direcciones en un sistema operativo de 64 bits con una aplicación de 32 bits, y si puede manejarlo, puede usar el interruptor LARGEADDRESSAWARE. No estoy seguro de por qué piensas que esto es incorrecto. – Thomas

6

espacio de direcciones virtuales http://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx

modo de usuario para cada proceso de 32 bits: 2 GB

+4

Windows no tiene forma de saber si Delphi usa aritmética firmada o sin firmar en direcciones de memoria, por lo que debe suponer que el bit superior no se puede utilizar a menos que declare explícitamente lo contrario. –

+0

@Mark: Es decir, no es verdad en absoluto. Como se indicó anteriormente, la configuración de un indicador de arranque permitirá a Delphi abordar más de 2 GB –

+1

@BlueRaja, "establecer un indicador de inicio" = "declarar explícitamente lo contrario". –

14

La sintaxis de Delphi para establecer el indicador LARGEADDRESSAWARE en el ejecutable PE es:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} 

poner esto en su archivo .dpr.

2

Mientras opte por recibir punteros de 32 bits con el conjunto de bits alto (incluyendo la bandera PE LARGE_ADDRESS_AWARE), no hay límite de 2 GB.

observación directa

var 
    p: Pointer; 
    n: Int64; 
begin 
    p := Pointer($D0000000); //Above the 2GB line; and the 3GB line! 

    p := VirtualAlloc(p, 1024, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE); 
    if p = nil then 
     RaiseLastWin32Error; 

    n := Cardinal(p); 
    ShowMessage(IntToHex(n, 16)); 
end; 

enter image description here

Conclusión

No hay un límite de 2 GB, en Windows de 64 bits, siempre y cuando juras que puede manejar punteros anteriores $ 7FFFFFFF.

Nota: Cualquier código se lanza al dominio público. No se requiere atribución.

Cuestiones relacionadas