进程内存限制为64位进程

时间:2010-03-08 03:42:16

标签: c# .net memory-management 64-bit

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

因此,我计划将其作为64位进程转移到x64平台。因此,这将有助于内存不足异常。我正在从MSDN上阅读这篇文章 Memory limits for Windows

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

5 个答案:

答案 0 :(得分:13)

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 TB阵列。此问题中的更多信息:Single objects still limited to 2 GB in size in CLR 4.0?

答案 1 :(得分:12)

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

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

答案 2 :(得分:6)

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

答案 3 :(得分:6)

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

答案 4 :(得分:5)

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