1

我的代码:

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. 一旦我在测试应用程序运行并且剩余大约 400 MB 时遇到 BSOD。关于可能导致这种情况的任何提示?我会检查 RAM 的完整性,还有什么?我应该小心PerformanceCounter.NextValue()循环调用还是什么?请注意,这是我第一次在这台 PC 上遇到 BSOD。
  4. 在程序执行的某些时候,我会遇到很大的延迟。例如,当我从 1 GB 可用 RAM 开始时,当我达到 700 MB 时,应用程序会冻结 1 秒,然后在大约 400 MB 时会冻结约 4 秒。为什么是这样?因为操作系统需要换出磁盘缓存以释放内存,还是什么?

注意:我为什么要这样做?好吧,我希望我的内存密集型应用程序检测到何时剩余 5 MB RAM,并提醒用户“内存不足,请关闭其他程序并返回,否则此程序将失败。”

4

1 回答 1

0

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

2) 你是在 32 位还是 64 位 Windows 上?听起来您正在运行一个可访问 3 GB 的大型地址感知进程(即在 32 位 Windows 上)。在任何情况下,您都必须记住,内存是在各种大小的卡盘中分配的,并且您的堆使用量并不是唯一的来源。CLR 本身有许多结构,每个线程都有一个堆栈等等。在任何情况下,你都不能指望能够使用 3 GB,

3) 蓝屏是由于驱动程序或内核错误。AFAIK 您的应用程序不会导致 BSOD,因此这很可能是无关的。

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

于 2009-08-25T17:01:53.083 回答