为什么这个c#程序会在64位24GB内存的计算机上耗尽内存?
本文关键字:内存 计算机 24GB 64位 程序 为什么 | 更新日期: 2023-09-27 18:01:18
这是我的代码:
public class Class1 { public int[][] binArray; public Class1() { binArray = new int[1000][]; for (int i = 0; i < 1000; i++) { binArray[i] = new int[61608]; } } }
class Program
{
static void Main(string[] args)
{
Class1 c1 = new Class1();
Class1 c2 = new Class1();
Class1 c3 = new Class1();
Class1 c4 = new Class1();
Class1 c5 = new Class1();
Class1 c6 = new Class1();
Class1 c7 = new Class1(); // Memory will run out at about this point
Class1 c8 = new Class1();
Class1 c9 = new Class1();
Class1 c0 = new Class1();
Console.WriteLine();
}
}
Class1用于存储数组,我认为它将获得足够的61608*4字节的内存片段为24GB的内存机器,为什么它仍然抛出一个out of memory exception
当我初始化第7类?
这几乎肯定是因为您将可执行文件构建为32b。即使在64b的机器上运行,一旦超过3GB的内存,也会爆炸。编译为64b,就可以了。
这看起来像你以32位执行。每个类实例使用大约250mb的内存(1000*61608*4 +开销),因此7个实例将使用大约1.7gb的内存。这是典型的。net 32位进程耗尽内存的情况,并且不再能够分配大的片段。
如果你在VS 2012中构建,要意识到,默认情况下,AnyCPU
(默认目标)仍然针对x86,因为有一个新的"首选32位"选项。关闭该选项将导致AnyCPU
作为64位进程构建和运行。
或者,您可以显式地将x64作为64位进程运行。
关于这个的一些简单的计算;
- 新的int数组的61608个元素。为数组指针添加1(立场对此进行纠正),因此61609
- 乘以1000 = 61609000,再加1为数组指针,61609001
- 乘以4,
int
相当于Int32
,每个Class1
得到246436004字节 - 乘以7每个
Class1
实例留下1,725,052,028字节…所以我们看到的是仅阵列就占用了大约1.6 gb
现在应用程序本身将占用更多的空间,因为我没有占到相当多的空间。内存不足异常的一个可能原因是由于系统上可能发生的分页。操作系统不保证程序的内存将驻留在RAM中。你的操作系统的页面文件设置是什么?
这是一个人们意想不到的"陷阱"。
http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os-aspx或新更新的URL
http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os"当在VS2010中为。net 4.0创建一个新的Visual c#控制台应用程序时,该项目的默认目标设置是针对x86平台,而不是像Visual Studio 2008那样针对任何CPU (MSIL) "
检查你的csproj的属性(特别是如果它是一个控制台应用程序)