В данной статье посмотрим как работать с 64 битными приложениями Delphi UniGUI. Зачем это нужно? Все очень просто. Для каждого пользователя в UniGui открывается отдельная сессия (копия программы). Скажем копия программы занимает в определенный момент времени 3 мб. памяти. И вот вопрос – сколько пользователей смогут работать одновременно, используя по 3 мб оперативной памяти? Ответ на этот вопрос очень прост – нужно разделить объем оперативной памяти на 3 мб. Но здесь встает вопрос о битности.
Скажем, у нас 32 битное приложение. Если мы откроем документацию, мы увидим такую картину
1 |
For Win32, the Memory Manager supports a user mode address space up to 2GB. |
Иными словами мы сможем открыть 2*1024/3 = 682 копии. Но и это не соответствует действительности, на практике доступно порядка 1 GB, после чего приложение отказывает с ошибкой “Out of memory”.
То есть, по факту для 32 битного приложения нам будет доступно 1024/3 = 341,3 копии, после чего произойдет переполнение памяти.
Что делать в этом случае? Ответ – использовать 64 битные приложения. И тогда ограничение на объем оперативной памяти практически снижается. Вот что написано в документации Delphi по этому поводу.
1 |
For Win64, the Memory Manager supports a user mode address space up to 16EiB in speculation. |
16 Эксабайт это 16*10^18 байт, то есть в теории, нам будет доступно 16*10^18 / (3*1024) ~ 5,2 *10^15 степени копий программы, думаю этого более чем достаточно для большинства задач. Но это в теории, а на практике, насколько я понимаю, после достижения максимума физической оперативной памяти задействуется файл подкачки, так что возможности ограничены жестким диском.
Теперь немного поэкспериментируем. Если выполнить инструкцию
1 |
AllocMem(512*1024*1024); // Выделит 512 мб. оперативной памяти приложению |
то для 32 битного приложения где-то в районе 1 GB можно получить “Out of Memory”, а для 64 битного можно преодолеть барьер и в 4 GB (у меня физической оперативной памяти на момент теста было 4 GB).
В Delphi XE8 и др. версий, чтобы сделать 64 битное приложение, нужно зайти в Project Manager, нажать правой кнопкой на Target Platform и добавить Windows 64. И далее скомпилировать приложение таким образом.
Единственное, чтобы запускать приложение под IIS нужно самой IIS указать, что запускаемая dll будет 64 битной. Для этого можно посмотреть инструкцию по настройке IIS и на шаге для включения 32 битных приложений отключить их поддержку, то есть так…
Программа, с помощью которой можно наблюдать за памятью это Process Explorer. Её можно скачать с официального сайта Microsoft.