понедельник, 19 июля 2010 г.

Что делать, если не хватает памяти?

Ситуация редкая, но, к сожалению, очень актуальная для тех, кто еще не перешел на x64 архитектуру: имеется x86 программа, требовательная к памяти, установлено достаточно ОЗУ (4-8 Гб), но процесс хоть и должен получать порядка 2 ГБ останавливается на 1.7 Гб и дальше либо активно свопит (мучает GC в случае .Net), либо падает с ошибками OOM.

Конечно, можно потратить сколько-то времени и сделать полноценный порт под x64, но для Windows есть еще один "ход конем", позволяющий выделить программе вплоть до 4Гб памяти на х64 системе и до 3Гб на x86. Это актуально как для .Net, так и программ на C++ и других языках.

Сама операция очень проста - берем утилиту EditBin из комплекта Visual C++ 2005/2008/2010 и выполняем команду
editbin.exe OurExe.exe /LARGEADDRESSAWARE

Наличие изменений можно посмотреть сравнив бинарный файл с оригиналом командой fc /bin.

На x86 системах может получиться, что не будет эффекта, пока не будет прописан ключ /3gb в файле boot.ini:
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Enterprise" /fastdetect /3GB


Никакой особой магии и шаманства в этой операции нет, все это давно описано на microsoft.com