Почему ограничение памяти 2 ГБ при работе в 64-битной Windows? - PullRequest
31 голосов
/ 29 апреля 2010

Я являюсь членом команды, которая разрабатывает приложение Delphi. Требования к памяти огромны. 500 МБ - это нормально, но в некоторых случаях это исключение из памяти. Объем памяти, выделяемой в этих случаях, обычно составляет от 1000 до 1700 МБ.

Нам, конечно, нужен 64-битный компилятор, но сейчас этого не произойдет (и если это произойдет, мы также должны конвертировать в Unicode, но это уже другая история ...).

Мой вопрос заключается в том, почему при работе в 64-битной среде существует ограничение в 2 ГБ на процесс. Указатель 32-битный, поэтому я думаю, что 4 ГБ будет правильным пределом. Я использую Delphi 2007.

EDIT: Поэтому, если я установлю флаг IMAGE_FILE_LARGE_ADDRESS_AWARE в Delphi с помощью:

{$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

И, запустив получившийся Exe-файл на Windows Server 2003 x64, тогда приложение может адресовать 4 ГБ?

  • Должен ли я установить переключатель / 3GB в boot.ini?
  • Мы пробовали это, но на 32-битной Windows Server 2003, и это, похоже, ограничивает ресурсы Windows. В журнале было больше исключений для «Недостаточно памяти» с GDIError. Но, может быть, это исчезнет при работе в 64-битной ОС?

Ответы [ 4 ]

32 голосов
/ 29 апреля 2010

Если вы скомпилируете приложение Delphi, используя флаг / LARGEADDRESSAWARE, оно сможет адресовать все 4 ГБ в 64-битной ОС. В противном случае при работе в WOW32 ОС предполагает, что приложение ожидает ту же среду, что и в 32-разрядной ОС, что означает, что из 4 ГБ адресного пространства 2 ГБ выделено для ОС, а 2 ГБ выделено для приложение.

14 голосов
/ 30 апреля 2010

Синтаксис в Delphi для установки флага LARGEADDRESSAWARE в исполняемом файле PE:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

Поместите это в свой файл .dpr.

6 голосов
/ 29 апреля 2010

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

Виртуальное адресное пространство в режиме пользователя для каждого 32-разрядного процесса: 2 ГБ

2 голосов
/ 01 октября 2013

Пока вы выбираете получение 32-битных указателей с установленным старшим битом (включая флаг LARGE_ADDRESS_AWARE PE), ограничение в 2 ГБ отсутствует.

Прямое наблюдение

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

Заключение

В 64-битной Windows нет ограничения в 2 ГБ, если вы клянетесь, что можете обрабатывать указатели выше $ 7FFFFFFF.

Примечание : любой код публикуется в открытом доступе. Указание авторства не требуется.

...