【问题标题】:OutOfMemoryException only in Release mode when compiled with VS2010?使用 VS2010 编译时仅在发布模式下出现 OutOfMemoryException?
【发布时间】:2011-05-26 18:20:49
【问题描述】:

我的程序仅在发布模式下生成OutOfMemoryExcetion,使用 VS2010 C# 编译器进行编译。崩溃发生时它正在执行的操作是实例化 1600 个锯齿状数组,并在以下循环的简化版本的第 207 个时中断:

Double[][] arr = new Double[1600][];
int i = 0;
while (i < 1600)
{
    arr[i] = new Double[1000000];
    i++;
}

基本上,考虑到 Double 占用 8 个字节,这部分代码将生成 ~ 11.9 GB。我没有那么多 RAM,但在 another question where I asked what happens when the RAM is over 中,他们回答我说 CLR 创建了一个交换内存,尽管它只能处理明确定义的内存量。

当我在DEBUG模式下编译我的程序时,它不会抛出OutOfMemoryException,而是分配大量内存并保持程序运行......我没有足够的耐心检查程序是否会顺利进行,虽然很慢,直到结束,因为它花费的时间太长。

所以:

  • 在发布模式下发生了什么,而不是在调试模式下,导致程序在那里抛出异常?
  • 考虑到我确实需要存储这么多内存,因为它是一些科学计算产生的数据,你对处理这个问题有什么建议? (我正在考虑在计算过程中处理生成的数据,虽然在计算过程中会花费更多时间,而不是生成大量数据然后处理它......)

【问题讨论】:

  • 请注意,您可以在 32 位进程中寻址的最大托管内存量为 2GB(如果您尚未编译为 x64 目标)。
  • 此外,发布模式通常更快,因此可能只是您没有等待足够长的时间让OutOfMemory 异常在调试版本中发生。

标签: c# out-of-memory


【解决方案1】:

假设您在 Visual Studio 2010 中创建项目,其平台目标将默认为 x86,即 32 位程序。我假设您已经将其更改为 x64,否则您将永远无法分配超过 2GB 的地址空间。

我的猜测是您刚刚转到项目属性> 构建选项卡,并更改了“平台目标”。问题是,如果这就是你所做的一切,那只会影响你的调试构建配置,因为屏幕顶部的“配置”过滤器默认为“活动(调试)”。

将该过滤器框更改为“发布”以查看您的发布构建设置。您还需要在此处将“平台目标”更改为“x64”。

【讨论】:

  • 就是这样......对不起我的无知,但是像我的VS2010这样的x86程序可以编译成x64处理器并不奇怪吗? (我是物理学家,不是计算科学家!)
  • 一点也不奇怪。它所需要做的就是为 x64 机器代码编写正确的字节。使用在完全不同的操作系统(例如 Mac、Windows)上运行的编译器为新平台(例如 iPhone、Android、Windows Phone 7)编译应用程序并不罕见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
相关资源
最近更新 更多