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

在这篇文章中,他引用了“内存不足”的声明:“现在这是一个用词不当.它真的应该是”无法找到足够的连续地址空间“错误;因为内存等于磁盘空间,所以内存充足.

他还说:

An “out of memory” error almost never happens because there’s not enough storage available; as we’ve seen, storage is disk space, and disks are huge these days. Rather, an “out of memory” error happens because the process is unable to find a large enough section of contiguous unused pages in its virtual address space to do the requested mapping.

当我查看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;
    }

你很可能有一些不好的代码而不是实际的内存韭菜.
  – 内存泄漏是由于没有关闭与资源的连接而不是代码而引起的.soda说… c#garbage collection将释放托管资源.

寻找c#静态对象……
你不应该在Windows服务中有任何东西,除非你真的知道为什么它在那里并用作帮助器.

Windows服务通常用于轮询某些东西……在民意调查的工作中……不应该有任何静态类用于帮助以外的任何东西.

如果你给出更多关于你的Windows服务的内容……那么可以提出更好的建议.

PS.回答你的问题:red-gate的Ant内存分析器非常好.
但我敢打赌,只要了解代码正在做什么,你就能更快地找到它.

点赞