【发布时间】: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