为什么’任何CPU(更喜欢32位)’允许我在.NET 4.5下分配比x86更多的内存?

根据许多SO答案和这篇被广泛引用的博客文章 ,为“任何CPU”构建的.NET 4.5应用程序选择了“首选32位”选项,将在32位和64位上作为32位进程运行系统(与.NET 4.0及更早版本不同)。 换句话说,选择’prefer 32-bit’的x86和AnyCPU是等效的(忽略它是否可以在ARM上运行)。

但是,我的测试表明,在64位系统上,“AnyCPU更喜欢32位”应用程序(我确认运行32位)可以分配比x86更多的内存。 我编写了一个.NET 4.5 C#控制台应用程序,它在循环中分配10MB字节数组(当然保留引用)直到它遇到OutOfMemoryException,并在具有大量RAM的64位系统上运行它。 当构建为x86时,它的分配大约为1.2GB。 构建为“任何CPU(更喜欢32位)”的相同代码最高可达1.5GB。

为什么不同?

事实certificate,在Visual Studio 2015中,构建为“AnyCPU(首选32位)”会在可执行文件上设置IMAGE_FILE_LARGE_ADDRESS_AWARE位(相当于在其上运行editbin /LARGEADDRESSAWARE ),而不是用于x86构建。 这可以通过dumpbin /HEADERS确认并查找“应用程序可以处理大(> 2GB)地址”这一行。

对于Visual Studio 2013,情况并非如此。此更改显然没有记录 。

从理论上讲,这应该给CLR增加2GB的空间。 我不知道为什么可分配的内存只增加了大约300MB。