进程内存限制为64位进程

我目前有一个32位.Net应用程序(在x86 Windows上)需要大量内存。 最近它开始抛出System.OutOfMemoryException了。

所以,我打算将它作为64位进程转移到x64平台。 因此,这将有助于内存不足exception。 我正在从Windows的 MSDN 内存限制中阅读本文

所以,我的问题是如果我编译一个64位的.Net应用程序,它是否将IMAGE_FILE_LARGE_ADDRESS_AWARE设置为默认值(正如文章建议的那样)? 即我能够利用8GB用户模式虚拟地址空间吗?

x64进程的最大内存限制为8 TB,但实际限制要小得多,因为它取决于系统上的物理内存量和页面文件大小。 有关详细信息,请参阅此post 。

IMAGE_FILE_LARGE_ADDRESS_AWARE影响在x64 OS(或带有/ 3GB指令的x86 OS)上运行的x86进程。 您的x64应用程序不需要设置大地址识别标志,它将能够使用系统上所有可用的虚拟内存。

IMAGE_FILE_LARGE_ADDRESS_AWARE仅与32位进程相关。 原因是32位Windows上的地址空间分为两部分:内核空间为2 GB,用户空间为2 GB。 要满足2 GB,您需要31位。 即32位应用程序中的指针不需要最后一位用于寻址。

某些应用程序可能已将此额外位用于自定义目的,因此如果Windows内存管理器突然向它们提供真正的32位地址,则它们无法处理。 通过启用IMAGE_FILE_LARGE_ADDRESS_AWARE标志,应用程序基本上告诉操作系统它可以处理整个32位可寻址空间。

如果在32位Windows上运行IMAGE_FILE_LARGE_ADDRESS_AWARE应用程序,则可以访问3 GB。 如果在64位Windows上运行相同的32位应用程序,则该进程实际上会获得整个4 GB的地址空间。

如果在64位Windows上运行64位应用程序,则用户地址空间为8 TB(另外8 TB用于内核地址空间)。 设置为AnyCPU的.NET应用程序将自动成为x64上的64位应用程序,因此您无需执行任何操作来解决额外内存问题。

但请记住,CLR对任何单个对象施加2 GB限制,因此虽然您的应用程序可能使用大量内存,但您无法创建2 TBarrays。 此问题中的更多信息: CLR 4.0中单个对象的大小仍限制为2 GB?

实际上,该文章声明您可以访问8 TB的虚拟地址空间(是的,这是真的)。

实际上在x64操作系统上如果您的应用程序是为AnyCPU编译的,那么您不需要做任何特别的事情。 JIT将在运行时创建x64映像,或者在32位系统上运行时创建x86映像。

移动到64位肯定有助于删除OutOfMemoryExceptions,但您可能希望专注于您的系统架构和编码机制以避免这些,因为它们在64位机器上也只是时间问题。
迁移到64位计算机的另一个优点是,对于8 TB的虚拟地址空间,.NET的垃圾收集很少发生。 这确实通过增加程序的可用虚拟空间来提高应用程序性能。