Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET内存不足异常-使用了1.3GB,但安装了16GB_C#_.net_Out Of Memory - Fatal编程技术网

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

C# .NET内存不足异常-使用了1.3GB,但安装了16GB,c#,.net,out-of-memory,C#,.net,Out Of Memory,当应用程序的内存使用量超过1.3GB时,我的C#应用程序出现内存不足异常 我在一台有3GB内存的32位机器上也遇到了同样的问题,这在当时是有道理的。但是现在我使用高端主板和高端RAM将硬件升级为一台64位机器,内存为16GB,但在1.3GB之后仍然会出现内存不足异常 我知道没有超过2GB的单个对象,而且1.3无论如何都小于2GB,因此单个对象上内置的MS 2GB限制不太可能成为问题 当应用程序达到某个内存使用阈值时,似乎存在某种Windows kill开关。然后应该有一种方法来配置它。它可能在登

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

我在一台有3GB内存的32位机器上也遇到了同样的问题,这在当时是有道理的。但是现在我使用高端主板和高端RAM将硬件升级为一台64位机器,内存为16GB,但在1.3GB之后仍然会出现内存不足异常

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

当应用程序达到某个内存使用阈值时,似乎存在某种Windows kill开关。然后应该有一种方法来配置它。它可能在登记处吗


任何帮助都将不胜感激

看起来您有一个64位的arch,很好——但是有一个32位版本的.NET运行时和/或32位版本的Windows

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


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

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

值得一提的是,如果在(比如)两种体系结构
32
64
位上获得单个集合分配的
2GB
内存,也可以提高这一性能


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

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

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


如果是32位,则可能是第三方库导致了这种情况。但首先要确保您的应用程序是为“任何CPU”编译的,如评论中所述。

如前所述,在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/largeaddressware

足够让您的程序使用4GB RAM
是在编译项目时生成的exe

如果希望在每次编译项目时自动执行此行为,请对已执行的项目使用以下生成后事件:

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

旁注:同样可以使用
devenv.exe
让Visual Studio也使用4GB RAM而不是1.2GB(但首先备份旧的
devenv.exe
)。

值得一提的是,“任意CPU”编译的默认值现在选中了“首选32位”复选框。如果设置为AnyCPU,则在具有16gb RAM的64位操作系统上,如果选中此选项,仍可能出现2gb的内存不足异常


如果您有32位窗口,如果没有以下设置,此方法将无法工作

  • 运行提示符cmd.exe(重要提示:以管理员身份运行)
  • 键入bcdedit.exe并运行
  • 查看“increaseuserva”参数,不存在以下语句
  • bcdedit/set increaseuserva 3072
  • 再次执行步骤2并检查参数
  • 我们添加了此设置,并启动了此块

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

    更多信息-command
    increaseuserva

    如果您在较新版本的Visual Studio(2017、2019)中搜索工具文件夹,我将其置于

    C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\Tools
    

    并且文件名为VsDevCmd.bat来自Visual Studio 2017及更高版本。

    您的操作系统也是64位的吗?即使您的操作系统是64位的,也要确保您的进程也是64位的(或AnyCPU)。是的,AnyCPU也是一个选项,您可以选择JIT体系结构相关的代码。但在您拥有非托管(比如)资源的情况下,针对特定体系结构仍然可以受益。我不知道OP的架构是关于什么的。我知道:)-谢谢Tigran,我用x64重建了解决方案,异常消失了。非常感谢。这对我有用。但是,在将内存限制提高到4GB之后,我们是否发现了任何问题。这绝对解决了我的内存不足问题,并为我们节省了大量的挫折