RAM PerformanceCounter问题

时间:2009-08-25 16:32:25

标签: .net windows-vista permissions performancecounter bsod

我的代码:

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());
}

问题:

  1. 文档似乎说我只能将PerformanceCounter用作管理员,但我将我的应用程序作为标准用户运行,并且它有效。我能依靠吗?
  2. 当大约200 MB RAM仍然存在时,我一直得到 OutOfMemoryException 为什么?它不能归因于碎片,因为我一次分配一个int。此外,它不能因为可寻址性问题,因为我已经超过2GB(当我的3GB中有2.8个被占用时抛出异常)。测试应用程序输出的数字通过侧面运行的任务管理器窗口进行验证。
  3. 当测试应用程序运行时,我获得了BSOD,剩下大约400 MB。关于什么可能导致这种情况的任何暗示?我会检查RAM的完整性,还有其他什么吗?我应该小心在循环中调用PerformanceCounter.NextValue(),还是什么?请注意,这是我第一次在这台PC上获得BSOD。
  4. 在程序执行的某些时候,我会遇到很大的延迟。例如。当我从1 GB的可用RAM开始,当我达到700 MB时,应用程序冻结1秒,然后在大约400 MB时冻结约4秒。为什么是这样?因为操作系统需要换出磁盘缓存以释放内存,还是什么?
  5. 注意:为什么我这样做?好吧,我希望我的内存密集型应用程序能够检测到剩余的5 MB RAM,并提醒用户“内存不足,请关闭其他程序并返回,否则此程序将失败。”

1 个答案:

答案 0 :(得分:0)

我无法解决您的所有问题,但这里有

2)你是32位还是64位Windows?听起来你正在运行一个大的地址识别过程,可以访问3 GB(即在32位Windows上)。在任何情况下,您都必须记住,内存是以各种大小的chuck分配的,并且您的堆使用不是唯一的来源。 CLR本身有许多结构,每个线程都有一个堆栈,依此类推。无论如何,你真的不能指望能够正好使用3 GB,

3)BSOD是由于驱动程序或内核错误造成的。 AFAIK你的应用程序不能导致BSOD,所以这很可能是无关的。

4)如果你使用大量内存,GC将很难跟上。由于在GC的某些部分正在进行时用户线程被暂停,这将显着减慢您的应用程序。