Статья: Ограничение доступной памяти в Win32 Delphi 2007
Введение:
Вопрос, поднятый пользователем dummzeuch, касается ограничения доступной памяти для программ на Win32 Delphi 2007, несмотря на установку флага IMAGE_FILE_LARGE_ADDRESS_AWARE, который должен позволить использовать до 3 ГБ памяти. В контексте обсуждения было выявлено, что проблема связана с отсутствием оператора or между флагами в директиве {$SETPEFLAGS}. Также обсуждались другие подходы к управлению памятью в Windows, такие как изменение предпочтений выделения памяти и настройка размера рабочего набора.
Основная часть:
Проверка флагов PE:
Программа на Delphi 2007 устанавливает флаг IMAGE_FILE_LARGE_ADDRESS_AWARE, который должен позволить использовать до 3 ГБ памяти. Однако, из-за отсутствия оператора or между флагами в директиве {$SETPEFLAGS}, флаг не был установлен корректно. Исправленная версия директивы должна выглядеть следующим образом:
pascal
{$SETPEFLAGS IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP or IMAGE_FILE_LARGE_ADDRESS_AWARE}
Изменение предпочтений выделения памяти:
Пользователь dummzeuch также упоминает, что изменил предпочтения выделения памяти в Windows, используя ключ реестра:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management
AllocationPreference= 0x100000
Это привело к тому, что система начала выделять память с верхней части адресного пространства, что могло повлиять на поведение программы.
Управление рабочим набором памяти:
FaFaFooey предложил код для изменения размера рабочего набора процесса, что, по его словам, помогло избежать сбоев:
pascal
var
LMinWSS, LMaxWSS: NativeUInt;
...
GetProcessWorkingSetSize(GetCurrentProcess, LMinWSS, LMaxWSS);
SetProcessWorkingSetSize(GetCurrentProcess, LMinWSS, LMaxWSS * 2);
Это может быть полезно в случаях, когда приложение сталкивается с ограничениями по размеру рабочего набора памяти.
Использование FastMM4 с MEM_TOP_DOWN:
David Heffernan упоминает, что использование FastMM4 с настройкой MEM_TOP_DOWN помогало выявлять ошибки, связанные с указателями и обрезанием значений.
Заключение:
Проблема с ограничением доступной памяти в Win32 Delphi 2007 программе была вызвана неправильной настройкой флагов PE. После внесения исправлений в код, проблема, скорее всего, была устранена. Однако, существуют и другие методы управления памятью в Windows, такие как изменение предпочтений выделения памяти и настройка размера рабочего набора, которые могут быть полезны в определённых ситуациях. Тем не менее, важно помнить, что такие методы могут иметь побочные эффекты и должны использоваться с осторожностью.
Пример кода:
program Project1;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils;
{$SETPEFLAGS IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP or IMAGE_FILE_LARGE_ADDRESS_AWARE}
...
// Код для работы с памятью и вызовами Windows API...
Вывод:
Убедитесь, что флаги PE установлены корректно, и если требуется, изучите дополнительные методы управления памятью для оптимизации работы вашего приложения.
Статья описывает проблему ограничения доступной памяти для программ на Win32 Delphi 2007 и предлагает решения, включая корректную настройку флагов PE и методы управления памятью в Windows.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.