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