我正在创建一个使用大量RAM的.NET应用程序(C#)。我最近了解到,在32位版本的Windows XP上,我只能使用2GB,除非我使用/3Gb
开关,并在可执行文件头中设置IMAGE_FILE_LARGE_ADDRESS_AWARE
标志。但是,由于我正在开发一个.NET应用程序,我想我不能直接修改可执行文件,对吗?那么,我该怎么做才能允许我的应用程序利用3GB呢?
我正在创建一个使用大量RAM的.NET应用程序(C#)。我最近了解到,在32位版本的Windows XP上,我只能使用2GB,除非我使用/3Gb
开关,并在可执行文件头中设置IMAGE_FILE_LARGE_ADDRESS_AWARE
标志。但是,由于我正在开发一个.NET应用程序,我想我不能直接修改可执行文件,对吗?那么,我该怎么做才能允许我的应用程序利用3GB呢?
editbin /LARGEADDRESSAWARE
来设置标志,但请注意,如果您使用类似ClickOnce的东西(因为它会维护文件的加密哈希),这样做将不起作用。dumpbin /HEADERS
命令来查找你的exe文件;我刚刚检查了一下,至少在我的测试中它默认不会这样做。 - Marc Gravell您还应该增加进程的最大工作集大小:请参阅SetProcessWorkingSetSize API。
嗯,我不确定这个问题,但这是我认为的:
.NET可执行文件可以通过两种方式编译 - 平台特定和平台无关。默认情况下,它们是平台无关的,当运行程序时,代码会(如其他答案中所述)JIT到平台特定的代码。
现在,例如,如果您的可执行文件是这些平台无关的之一,并且在64位操作系统上运行它,它将被JIT到64位代码,对吧?因此,它将能够访问超过3GB的RAM。
我的意思是 - 我认为PE头中写了什么并不重要。实际可用RAM的数量由.NET运行时确定,后者又查看当前平台并生成最佳的JIT代码。
我认为您不应该担心/3GB开关,因为.NET会为您处理它。相信.NET! :)
你可以尝试使用命名管道进行远程调用,并通过物理上拥有更多进程来获得更多内存。
如果你正在进行任何形式的Interop(普通的.Net套接字也算在内),你应该创建一个对象缓存(例如,使用套接字的byte[]缓冲区),在应用程序启动时分配大量这些对象。
你应该阅读this article。
我刚在 Windows 10 (64位) 上用 VS2019 测试了一个小的 x86 C# 程序。
默认情况下,在它耗尽内存之前,我可以分配 1605 个大小为 1Mb 的字符串。
通过设置:
"editbin /LARGEADDRESSAWARE my.exe"
我可以分配 3330 个大小为 1Mb 的字符串,在它耗尽内存之前。
在 Windows 10 (64位) 上,因此可以寻址超过 3Gb 的空间。