我的代码:
var list = new LinkedList<int>();
var ramCounter = new PerformanceCounter("Memory", "Available MBytes");
while (true)
{
for(int i = 0; i < 1000 * 1000; i++) list.AddLast(0);
Console.WriteLine(ramCounter.NextValue());
}
问题:
PerformanceCounter.NextValue()
,还是什么?请注意,这是我第一次在这台PC上获得BSOD。注意:为什么我这样做?好吧,我希望我的内存密集型应用程序能够检测到剩余的5 MB RAM,并提醒用户“内存不足,请关闭其他程序并返回,否则此程序将失败。”
答案 0 :(得分:0)
我无法解决您的所有问题,但这里有
2)你是32位还是64位Windows?听起来你正在运行一个大的地址识别过程,可以访问3 GB(即在32位Windows上)。在任何情况下,您都必须记住,内存是以各种大小的chuck分配的,并且您的堆使用不是唯一的来源。 CLR本身有许多结构,每个线程都有一个堆栈,依此类推。无论如何,你真的不能指望能够正好使用3 GB,
3)BSOD是由于驱动程序或内核错误造成的。 AFAIK你的应用程序不能导致BSOD,所以这很可能是无关的。
4)如果你使用大量内存,GC将很难跟上。由于在GC的某些部分正在进行时用户线程被暂停,这将显着减慢您的应用程序。