100

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

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

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

当应用程序达到某个内存使用阈值时,似乎存在某种类型的 Windows 终止开关。那么应该有一种方法来配置它。也许在注册表中?

任何帮助将不胜感激!

4

8 回答 8

95

在编译到相同的目标架构之前没有区别。我32在这两种情况下都在为位架构进行编译。

值得一提的是,如果您在架构和位上获得由CLR(例如)中的单个集合分配的内存,OutOfMemoryException也可以提出。2GBList<T>3264

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

于 2013-01-06T20:17:06.827 回答
67

如前所述,以 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)。

于 2013-01-07T06:28:00.140 回答
30

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

Prefer32BitCheckBox

于 2016-09-27T12:06:17.703 回答
2

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

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

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

于 2013-01-06T20:14:08.623 回答
1

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

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

如果是 32 位,第三方库可能会导致此问题。但首先确保您的应用程序正在为“任何 CPU”编译,如评论中所述。

于 2013-01-06T20:21:46.723 回答
0

如果您有 32 位 Windows,则此方法在没有以下设置的情况下不起作用。

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

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

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

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

于 2018-07-17T10:18:49.287 回答
0

如果您只想为 VS 之外的特定 32 位应用程序提供对更多内存的访问,那么https://github.com/cybertechniques/site/blob/master/analysis_tools/cff-explorer/index 中有一个有用的应用程序。 md将为您设置应用程序标题。

  • 从 NT Core 站点或 CFF Explorer 文件下载“CFF Explorer”。
  • 启动“CFF Explorer”并打开 EXE(例如 C:\Users\dennisg\AppData\Local\Apps\2.0\MHV1WDDC.958Y0ELE416.L7Y\myapp.exe)
  • 项目清单

在窗口左侧,选择“Nt Headers”下的“File Header”部分 在右侧查找以“Characteristics”开头的行和“Click here”字段。点击那里。(下一部分出现上下文菜单)。选择/启用“应用程序可以处理 >2gb 地址”复选框,然后单击“确定”。保存文件(文件 > 保存)。

于 2021-11-19T10:03:27.830 回答
-2

如果您在较新版本的 Visual Studio (2017, 2019)中搜索工具文件夹,我在下面

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

并且文件的名称是Visual Studio 2017 及更高版本中的VsDevCmd.bat

于 2021-03-16T07:31:09.850 回答