进程内存限制为64位进程

Sys*_*min 17 .net c# 64-bit memory-management

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

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

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

Bri*_*sen 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位可寻址空间.

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

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

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


Jef*_*Cyr 12

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

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


And*_*are 6

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


Jos*_*osh 6

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


Bha*_*h K 5

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