delphi - ¿Por qué 2 GB de límite de memoria cuando se ejecuta en Windows de 64 bits?
delphi-2007 win64 (4)
La sintaxis en Delphi para establecer el indicador LARGEADDRESSAWARE en el ejecutable PE es:
{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
Ponlo en tu archivo .dpr.
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 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. Yo uso Delphi 2007.
EDITAR: Entonces si configuro el indicador IMAGE_FILE_LARGE_ADDRESS_AWARE en Delphi usando:
{$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
¿Y ejecutando el archivo Exe resultante en un Windows Server 2003 x64, la aplicación puede gestionar 4 GB?
- ¿Debo configurar / 3GB cambiar en boot.ini?
- Hemos intentado esto pero en 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?
Mientras opte por recibir punteros de 32 bits con el conjunto de bits alto (incluyendo el LARGE_ADDRESS_AWARE
PE), 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;
Conclusión
No hay límite de 2 GB en Windows de 64 bits, siempre y cuando pueda jurar que puede manejar punteros por encima de $ 7FFFFFFF.
Nota : Cualquier código se libera en el dominio público. No se requiere atribución.
Si compila la aplicación Delphi con el indicador / LARGEADDRESSAWARE, podrá tratar los 4 GB completos 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.
http://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx
Espacio de direcciones virtuales en modo de usuario para cada proceso de 32 bits: 2 GB