c# – 如何从代码监视内存分配
我有一个
Windows服务,最终会抛出“Out of Memory”异常.它是用C#编写的,在Windows 7上运行.
是的,我已经在Stack Overflow以及互联网上的其他地方阅读了有关此内容的现有问题.事实上,我发现一篇由Eric Lippert撰写的精彩文章称为“Out of Memory”并不是指物理记忆,在那里他提供了对这种情况的非常明确的解释. http://blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx?PageIndex=1#comments 在这篇文章中,他引用了“内存不足”的声明:“现在这是一个用词不当.它真的应该是”无法找到足够的连续地址空间“错误;因为内存等于磁盘空间,所以内存充足. 他还说:
当我查看PerfMon中的服务时,我会看到Memory for Commit,Working Set和Private下的列,这些列都在不断增长.我确定有一些字符串不断添加到某个列表中,或者某些列表未被清除. 我的问题是,C#中是否有一些技术可以用来监视代码本身内部对象或集合的内存请求,例如可以监视系统的类库?如果是这样,我可以监视代码本身内的连续内存请求. 解决方法
使用c#代码告诉您Windows服务消耗了多少.
private float GetActuratePrivateWorkingSet(Process currentProcess) { // get the physical mem usage for this process var pc = new PerformanceCounter("Process","Working Set - Private",currentProcess.ProcessName,true); pc.NextValue(); Thread.Sleep(1000); var privateWorkingSet = pc.NextValue()/ 1024/1024; return privateWorkingSet; } 你很可能有一些不好的代码而不是实际的内存韭菜. 寻找c#静态对象…… Windows服务通常用于轮询某些东西……在民意调查的工作中……不应该有任何静态类用于帮助以外的任何东西. 如果你给出更多关于你的Windows服务的内容……那么可以提出更好的建议. PS.回答你的问题:red-gate的Ant内存分析器非常好.但我敢打赌,只要了解代码正在做什么,你就能更快地找到它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |