首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RAM PerformanceCounter问题

RAM PerformanceCounter问题
EN

Stack Overflow用户
提问于 2009-08-25 16:32:24
回答 1查看 724关注 0票数 1

我的代码:

代码语言:javascript
复制
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());
}

问题:

文档似乎说,我只能将Administrator,作为使用PerformanceCounter,但是我以标准用户的身份运行了应用程序,并且运行起来了。我能依赖这个吗?当大约200 MB的内存仍然存在时,OutOfMemoryException一直是

  1. 为什么是?这不可能是碎片造成的,因为我一次分配一个int。而且,这不可能是因为可寻址问题,因为我已经超过2GB了(当我的3GB中的2.8被删除时,异常就会抛出)。测试应用程序输出的数字是用一个任务管理器窗口在旁边运行的。当测试应用运行时,
  2. 得到了一个BSOD,并且还剩下大约400 MB。有什么可能导致这种情况的线索吗?我要检查一下RAM的完整性,还有别的吗?我应该小心在循环中调用PerformanceCounter.NextValue()吗?注意,这是我第一次在这台PC上得到
  3. ,在程序执行的某些时候,我会遇到很大的延迟。例如,当我开始使用1GB的空闲内存时,当我获得700 MB的内存时,应用程序会冻结1秒,然后在大约400 MB时冻结大约4秒。为什么会这样呢?因为操作系统需要交换磁盘缓存来释放内存,或者什么的?

注:,我为什么要这么做?好吧,我希望我的内存密集型应用程序能检测出5 MB内存的残留情况,并以“内存不足,请关闭其他程序并返回,否则这个程序将失败”警告用户。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-08-25 17:01:53

我不能回答你所有的问题,但我说

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

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

4)如果你使用大量的内存,GC将很难跟上。当用户线程被挂起时,GC的某些部分正在进行中,这将大大降低应用程序的速度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1329421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档