为什么在64位Windows中运行时2 GB内存限制?

Rol*_*son 31 delphi win64 delphi-2007

我是开发Delphi应用程序的团队的成员.内存需求量很大.500 MB是正常的,但在某些情况下它会出现内存异常.在这种情况下分配的内存通常在1000 - 1700 MB之间.

我们当然需要64位编译器,但现在不会发生(如果它发生,我们也必须转换为unicode,但这是另一个故事......).

我的问题是为什么在64位环境中运行时每个进程有2 GB的内存限制.指针是32位,所以我认为4 GB是正确的限制.我使用Delphi 2007.

编辑: 所以如果我使用以下方法在Delphi中设置IMAGE_FILE_LARGE_ADDRESS_AWARE标志:

{$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
Run Code Online (Sandbox Code Playgroud)

并在Windows Server 2003 x64上运行生成的Exe文件,然后该应用程序可以处理4 GB?

  • 我应该在boot.ini中设置/ 3GB开关吗?
  • 我们尝试了这个但是在32位Windows Server 2003上它似乎限制了Windows资源.在日志中使用GDIError的"Out of memory"有更多例外.但是在64位操作系统中运行时可能会消失吗?

Tho*_*mas 32

如果使用/ LARGEADDRESSAWARE标志编译Delphi应用程序,它将能够在64位操作系统上处理完整的4GB.否则,当在WOW32中运行时,操作系统假定应用程序期望与32位操作系统相同的环境,这意味着4GB的地址空间,2GB专用于操作系统,2GB分配给应用程序.

  • 这只适用于32位.3GB指针和4GB指针之间没有二进制差异,因此任何可以处理3GB的应用程序都可以达到4GB./ LARGEADDRESSAWARE适用于64位系统上的完整4GB,无需任何启动修改.如果你想在32位系统中使用更多的地址空间,你唯一需要做3GB的时间.您链接的文章已过时十年,仅适用于32位系统.PAE是一个完全不同的系统. (4认同)
  • @Deltics - LARGEADDRESSAWARE 不仅适用于 3GB 这绝对不正确。http://msdn.microsoft.com/en-us/library/wz223b1z%28VS.80%29.aspx。这表明应用程序可以处理超过 2GB 的 **ANY** 地址。如果您想在 64 位操作系统上使用 32 位应用程序获得完整的 4GB 地址空间并且它可以处理它,那么您可以使用 LARGEADDRESSAWARE 开关,这是绝对正确的。我不确定你为什么认为这是不正确的。 (2认同)

小智 14

Delphi中用于在PE可执行文件中设置LARGEADDRESSAWARE标志的语法是:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
Run Code Online (Sandbox Code Playgroud)

把它放在你的.dpr文件中.


Mat*_*ves 6

http://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx

每个32位进程的用户模式虚拟地址空间:2 GB

  • Windows无法知道Delphi是否对内存地址使用有符号或无符号算术,因此除非您明确声明,否则必须假设高位不可用. (4认同)