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