{$ SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}无法在我的应用程序中工作

时间:2018-06-24 09:40:40

标签: delphi

我有一个使用运行时程序包构建的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失败,并且可以使用标志集。

是否为我的应用程序配置了错误的步骤?

1 个答案:

答案 0 :(得分:1)

  

我认为可执行文件应该设置有标志。

最好使用sysinternals套件中的vmmap之类的工具进行检查。

但是,即使应用程序具有4GB可寻址空间,内存碎片也可能不允许两个1GB大小的块。低于2GB的最大可用块通常略小于一个GB,而高于2GB的通常有一些小东西阻止您分配它的 all

请注意,堆管理会有一些开销-您的1 GB块实际上需要1GB加上几个字节的可用空间。