.NET内存不足例外 – 使用1.3GB,但安装了16GB

当应用程序的内存使用量超过了大约1.3GB时,我在c#应用程序中出现了“内存不足”exception。

在一台拥有3GB内存的32位机器上,我遇到了同样的问题,当时我觉得这很有意义,但是现在我把硬件升级到了一个64位的机器,内存为16GB,高端主板和内存,但是内存不足在1.3GB之后仍然出现exception!

我知道没有超过2GB的单个对象,而1.3的数据less于2GB,所以单个对象的内置MS 2GB限制不太可能成为问题。

它似乎有一个窗口kill-switch某种应用程序达到一定的内存使用阈值…然后应该有一种方法来configuration这是在registry也许?

任何帮助将不胜感激!

编译到相同的目标架构之前,没有区别。 我你在这两种情况下都是为32位体系结构编译的。

值得一提的是,如果你在CLR (比如List<T> )中得到2GB的内存分配给2GB的内存,那么也可以引发OutOfMemoryException

为了能够从64位体系结构的内存中受益,您必须编译针对64位体系结构的代码。 之后,自然而然,你的二进制文件只能运行在64位,但会受益于更多的可用RAM空间的可能性。

如前所述,在x64中编译应用程序会为您提供更多的可用内存。

但是,如果必须在x86中构build应用程序,则有一种方法可将内存限制从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在同一个目录下执行vcvars32.bat 。 然后a

editbin /LARGEADDRESSAWARE <your compiled exe file>

足以让你的程序使用4GB RAM。 <your compiled exe file><your compiled exe file> ,这是VS在编译你的项目时生成的。

如果要在每次编译项目时自动执行此行为,请对执行的项目使用以下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 )。

值得一提的是,“Any CPU”编译的默认值会检查“Prefer 32bit”checkbox。 被设置为AnyCPU,在64位的操作系统与16GB的内存仍然可以打到2GB的内存不足exception,如果这是检查。

Prefer32BitCheckBox

它看起来像你有一个64位的拱,很好 – 但一个32位版本的.NET运行时和/或一个32位版本的Windows。

因此,您的进程可用的地址空间仍然是相同的,它没有改变你以前的设置。

升级到64位操作系统和64位.NET版本;)

您的应用程序是以64位还是32位进程运行? 你可以在任务pipe理器中检查这个。

它可能是,即使整个系统运行在64位上,它仍然以32位运行。

如果是32位,第三方库可能会造成这种情况。 但首先请确保您的应用程序正在编译“任何CPU”,如评论中所述。