OutOfMemoryException仅在使用VS2010编译时处于Release模式

本文关键字:Release 模式 编译 VS2010 OutOfMemoryException | 更新日期: 2023-09-27 17:57:41

我的程序仅在Release模式下生成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.9GB。我没有那么多的RAM,但在另一个问题中,我问RAM用完后会发生什么,他们回答我CLR创建了一个交换内存,尽管它只能处理定义好的内存量。

当我在DEBUG模式下编译程序时,它不会抛出OutOfMemoryException,相反,它会分配大量内存并保持程序运行。。。我没有足够的耐心来检查这个程序是否能顺利运行,尽管运行得很慢,直到最后,因为它花了太长时间。

因此:

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

OutOfMemoryException仅在使用VS2010编译时处于Release模式

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

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

将该筛选框更改为"发布"以查看您的发布版本设置。您还需要在此处将"平台目标"更改为"x64"。