我有一个使用运行时程序包构建的win32应用程序。我的.dpr文件中启用了{$ SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}。我认为可执行文件应该设置了标志。
然后我测试分配此内存:
var A, B: TBytes;
procedure TForm60.Button1Click(Sender: TObject);
begin
SetLength(A, 1024*1024*1024);
SetLength(B, 1024*1024*1024);
end;
,我得到Out of memory
错误。我还要确保应用程序的运行时内存小于100M。应该低于3GB的限制。
我的运行时环境是Windows 10 v1803,RAD Studio 10.2 Tokyo版本3。该应用程序使用很少的第三方.bpl。
我尝试一个示例项目,并且IMAGE_FILE_LARGE_ADDRESS_AWARE
标志正在按预期方式工作。如果没有IMAGE_FILE_LARGE_ADDRESS_AWARE
,则上面的代码将以Out of memory
失败,并且可以使用标志集。
是否为我的应用程序配置了错误的步骤?
答案 0 :(得分:1)
我认为可执行文件应该设置有标志。
最好使用sysinternals套件中的vmmap
之类的工具进行检查。
但是,即使应用程序具有4GB可寻址空间,内存碎片也可能不允许两个1GB大小的块。低于2GB的最大可用块通常略小于一个GB,而高于2GB的通常有一些小东西阻止您分配它的 all 。
请注意,堆管理会有一些开销-您的1 GB块实际上需要1GB加上几个字节的可用空间。