.NET内存不足异常-已使用1.3GB,但已安装16GB


91

当应用程序的内存使用量超过1.3GB时,我的C#应用​​程序中出现了内存不足异常。

我在具有3gb内存的32位计算机上遇到了同样的问题,那时还是有意义的,但是现在我将硬件升级到了具有16GB内存,高端主板和RAM但内存不足的64位计算机1.3GB之后仍会发生异常!

我知道没有单个对象超过2GB,无论如何,1.3小于2GB,因此单个对象的内置MS 2GB限制不太可能成为问题...

似乎当应用程序达到一定的内存使用量阈值时,会有某种Windows终止开关……那么也许应该有一种方法可以在注册表中进行配置?

任何帮助将不胜感激!


9
您的操作系统也是64位吗?
fge

9
即使您的操作系统是64位,也请确保您的进程也是64位(或AnyCPU)
Knowleech 2013年

Answers:


90

除非您编译为相同的目标体系结构,否则没有任何区别。我32在两种情况下都将针对位架构进行编译。

值得一提的是OutOfMemoryException还可以,如果你提出2GB的由单个集合中分配的内存CLR(说List<T>)两种体系结构3264位。

为了能够从64位架构的内存优势中受益,您必须编译针对64位架构的代码 。之后,自然地,您的二进制文件将64在位上运行,但将受益于RAM中有更多可用空间的可能性。


8
那AnyCPU呢?
dtb

1
是的,AnyCPU也是一个选项,您可以选择依赖JIT体系结构的代码。但是,在您拥有非托管(例如)资源的情况下,针对特定体系结构仍然可以受益。我不知道OP的架构是什么。
Tigran 2013年

4
我知道:)-感谢Tigran,我在x64中重建了解决方案,但异常消失了。
Paceman

63

如前所述,在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>是exe,是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)。


非常感谢。这对我有用。但是在将内存限制提高到4GB之后,我们是否有任何已确定的问题。
Maverick

28

值得一提的是,“任何CPU”编译的默认值现在选中了“首选32位”复选框。如果将其设置为AnyCPU,则在具有16gb RAM的64位OS上,如果选中此选项,仍会遇到2gb的内存不足异常。

Prefer32BitCheckBox


2
这绝对解决了我的内存不足问题,为我们节省了很多挫败感
-RSSM

2

看来您具有64位的体系结构,但很好-但是32位版本的.NET运行时和/或32位版本的Windows。

因此,您的进程可用的地址空间仍然相同,与以前的设置相比没有变化。

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


1

您的应用程序是作为64位还是32位进程运行?您可以在任务管理器中进行检查。

即使整个系统都在64位上运行,它也可能以32位运行。

如果是32位,则可能是由第三方库引起的。但是首先请确保您的应用程序正在针对“任何CPU”进行编译,如注释中所述。


0

如果您使用的是32位Windows,则必须遵循以下设置才能使用此方法。

  1. 运行提示符cmd.exe(重要:以管理员身份运行)
  2. 键入bcdedit.exe并运行
  3. 查看“ increaseuserva”参数,然后再写以下语句
  4. bcdedit / set增加用户3072
  5. 并再次执行步骤2并检查参数

我们添加了此设置,此块开始了。

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
   call "$(DevEnvDir)..\tools\vsvars32.bat"
   editbin /largeaddressaware "$(TargetPath)"
)

更多信息-命令increaseuservahttps : //docs.microsoft.com/zh-cn/windows-hardware/drivers/devtest/bcdedit--set

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.