.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,如果这是检查。
它看起来像你有一个64位的拱,很好 – 但一个32位版本的.NET运行时和/或一个32位版本的Windows。
因此,您的进程可用的地址空间仍然是相同的,它没有改变你以前的设置。
升级到64位操作系统和64位.NET版本;)
您的应用程序是以64位还是32位进程运行? 你可以在任务pipe理器中检查这个。
它可能是,即使整个系统运行在64位上,它仍然以32位运行。
如果是32位,第三方库可能会造成这种情况。 但首先请确保您的应用程序正在编译“任何CPU”,如评论中所述。