.NET Out of Memory异常 - 使用1.3GB但安装了16GB

时间:2013-01-06 20:11:57

标签: c# out-of-memory

当应用程序的内存使用量超过1.3GB时,我的c#应用程序中出现Out Of Memory异常。

我在具有3GB内存的32位机器上遇到了同样的问题,当时它很有意义,但现在我将硬件升级到64位机器,配备16GB内存和高端主板和RAM但是超出内存异常仍然发生在1.3GB之后!

我知道没有超过2GB的单个对象,而且无论如何1.3都不到2GB,因此单个对象的内置MS 2GB限制可能不是问题......

当应用程序达到某个内存使用阈值时,似乎有某种类型的Windows kill-switch ...那么应该有一种方法可以在注册表中配置它吗?

任何帮助将不胜感激!

7 个答案:

答案 0 :(得分:83)

编译到同一目标架构之前没有区别。在这两种情况下,我假设您正在为32位架构进行编译。

值得一提的是,如果OutOfMemoryException(例如CLR)中的单个集合分配了2GB32内存,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)

值得一提的是“任何CPU”的默认值。编译现在检查&#39;首选32位&#39;复选框。设置为AnyCPU,在具有16GB RAM的64位操作系统上,如果选中此选项,仍然会在2gb时遇到内存不足异常。

Prefer32BitCheckBox

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

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

可能是,它运行为32位,即使整个系统在64位运行。

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

答案 5 :(得分:0)

如果没有以下设置,此方法将无效。

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

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

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 及更高版本。