当应用程序的内存使用量超过1.3GB时,我的c#应用程序中出现Out Of Memory异常。
我在具有3GB内存的32位机器上遇到了同样的问题,当时它很有意义,但现在我将硬件升级到64位机器,配备16GB内存和高端主板和RAM但是超出内存异常仍然发生在1.3GB之后!
我知道没有超过2GB的单个对象,而且无论如何1.3都不到2GB,因此单个对象的内置MS 2GB限制可能不是问题......
当应用程序达到某个内存使用阈值时,似乎有某种类型的Windows kill-switch ...那么应该有一种方法可以在注册表中配置它吗?
任何帮助将不胜感激!
答案 0 :(得分:83)
在编译到同一目标架构之前没有区别。在这两种情况下,我假设您正在为32
位架构进行编译。
值得一提的是,如果OutOfMemoryException
(例如CLR)中的单个集合分配了2GB
个32
内存,List<T>
也会被提出{{3}} {{3}} 1}}和64
位。
为了能够从64
位体系结构的内存良好中受益,您必须编译面向64
位体系结构的代码。之后,您的二进制文件自然会在64
位上运行 ,但会受益于RAM中有更多可用空间的可能性。
答案 1 :(得分:58)
如前所述,在x64中编译应用程序会为您提供更多可用内存。
但是在必须在x86中构建应用程序的情况下,有一种方法可以将内存限制从1,2GB提高到4GB(这是32位进程的实际限制):
在Visual Studio安装目录的VC / bin文件夹中,必须有editbin.exe
个文件。所以在我的默认安装中,我在
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe
为了使程序正常工作,您可能必须先在同一目录中执行vcvars32.bat
。
editbin /LARGEADDRESSAWARE <your compiled exe file>
足以让您的程序使用4GB RAM。 <your compiled exe file>
是在编译项目时VS生成的exe。
如果要在每次编译项目时自动执行此行为,请对执行的项目使用以下Post-Build事件:
if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
call "$(DevEnvDir)..\tools\vsvars32.bat"
editbin /largeaddressaware "$(TargetPath)"
)
旁注:使用devenv.exe
也可以这样做,让Visual Studio也使用4GB RAM而不是1.2GB(但首先备份旧的devenv.exe
)。
答案 2 :(得分:18)
答案 3 :(得分:2)
看起来你有一个64位的拱门,很好 - 但是32位版本的.NET运行时和/或32位版本的Windows。
因此,您的流程可用的地址空间仍然相同,它与之前的设置相比没有变化。
升级到64位操作系统和64位.NET版本;)
答案 4 :(得分:1)
您的应用程序是以64位还是32位进程运行? 您可以在任务管理器中进行检查。
可能是,它运行为32位,即使整个系统在64位运行。
如果是32位,第三方库可能会造成这种情况。但首先要确保您的应用程序正在编译“Any CPU”,如评论中所述。
答案 5 :(得分:0)
如果没有以下设置,此方法将无效。
- 运行提示符cmd.exe(重要:以管理员身份运行)
- 键入bcdedit.exe并运行
- 查看“ increaseuserva”参数,然后再写以下语句
- bcdedit / set gainuserva 3072
- 然后再次执行步骤2并检查参数
我们添加了此设置,此块开始了。
if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
call "$(DevEnvDir)..\tools\vsvars32.bat"
editbin /largeaddressaware "$(TargetPath)"
)
答案 6 :(得分:-2)
如果您要在较新版本的 Visual Studio (2017, 2019) 中搜索工具文件夹,我会在
下找到它C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\Tools
并且文件的名称是 VsDevCmd.bat 从 Visual Studio 2017 及更高版本。