Rayne, можешь попробовать скачать с сайта microsoft утилиту
VMMap. Она позволяет исследовать виртуальное адресное пространство процессов. Натрави её на Demul во время воспроизведения ошибки. Обрати внимание на вот это число:
Вложение:
1.png [ 29.51 КБ | Просмотров: 9400 ]
Оно показыват самый большой непрерывный свободный блок в адресном пространтсве процесса. Если оно меньше 524 288, то значит адресное пространтсво процесса с Demul неудачным образом фрагментировано и выделить блок нужного размера невозможно. Не потому что мало памяти, а потому что блок размером 512 Mb просто некуда впихнуть в адресное пространство процесса.
На фрагментацию процесса влияют множество факторов: то, каким образом сам Demul запрашивает память, то как Windows решит её в данный момент выдать, то как Windows решит разместить DLL-ки в адресном пространстве процесса, и прочее другое. Также, очень часто антивирусы и файрволы инжектят свои DLL-ки в пользовательские процессы, что может вызывать дополнительную фрагментацию. Но это делают не только антивирусы и файрволы. Вот пример:
Вложение:
2.png [ 64.33 КБ | Просмотров: 9400 ]
Тут можно наблюдать как словарь Lingvo нагло вторгся в чужой процесс, причём сделал это самым нахальным способом, разделив диапазон свободных адресов размером 1.2 G почти пополам: на блок ~534M и ~781M. Совершенно непонятно, почему он решил влезть именно в середину самого большого блока, но совершенно очевидно, что ещё парочка вот таких Lingvo посреди блоков 534 и 781 M и о запуске Demul можно забыть.
Вот как вся эта прелесть выглядит в общем виде:
Вложение:
3.png [ 16.31 КБ | Просмотров: 9400 ]
Чёрная полоска посередине это и есть тот самый Lingvo. Вверху блок 534M, внизу - 781M. Можешь покопаться в своём процессе Demul и посмотреть, кто именно вызывает фрагментацию.
А вообще, вопрос к разработчикам Demula, зачем им понадобился непрерывный блок памяти размером в 512M. Это нужно для эмуляции, или вы просто сразу берёте памяти сколько нужно, потому что боитесь, что Винда вам потом её не даст лол? Для 32-х битных процессов 512M это довольно дохрена. Размер адресного пространства 32-х битных процессов в Винде по умолчанию равен двум гигабайтам:
https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa366912(v=vs.85).aspx. Остальные 2 Гига это адреса ядра, как я понял . Это значит, что достаточно 4 аллокации в ненужных местах, и свободного блока размером в 512M уже нет. Можно попробовать включить фичу
4-Gigabyte Tuning, тогда адресов для процесса будет уже на 3 Гига. Возможно, это один из вариантов решения проблемы.
При таком раскладе, возможно, имеет-таки смысл поддерживать 64-битную версию, в которой по идее таких проблем быть не должно. Или таки не жадничать, и просить у Винды по чуть-чуть.
ЗЫ Если что, процесс на моих картинках это не Demul, а просто первый попавшийся 32-битный.