如何从代码中监视内存分配

dta*_*lor 5 c# memory memory-management

我有一个 Windows 服务最终抛出“内存不足”异常。它是用 C# 编写的,运行在 Windows 7 上。

\n\n

是的,我已经在 Stack Overflow 以及互联网上的其他地方阅读了有关此问题的现有问题。事实上,我发现了 Eric Lippert 写的一篇很棒的文章,名为“内存不足”并不指物理内存,他在其中对这种情况提供了非常清晰的解释。

\n\n

http://blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx?PageIndex=1#comments

\n\n

在这篇文章中,他用这样的语句来提到“内存不足”:“现在这是一个用词不当。它确实应该是一个 \xe2\x80\x9cunable 找不到足够的连续地址空间\xe2\x80\x9d 错误;那里\xe2\x80\x99s 有足够的内存,因为内存等于磁盘空间”。

\n\n

他还指出:

\n\n
\n

\xe2\x80\x9cout of memory\xe2\x80\x9d 错误几乎不会发生,因为\xe2\x80\x99s 没有足够的可用存储空间;正如我们\xe2\x80\x99所看到的,存储就是磁盘空间,而如今磁盘空间非常大。相反,发生 \xe2\x80\x9cout of memory\xe2\x80\x9d 错误是因为进程无法在其虚拟地址空间中找到足够大的连续未使用页面部分来执行请求的映射。

\n
\n\n

当我查看 PerfMon 中的服务时,我看到“提交内存”、“工作集”和“私有内存”下的列,所有这些列都在不断增长。我确信有一些字符串不断被添加到或一些列表没有被清除。

\n\n

我的问题是,C# 中是否有一些技术可以用来监视代码本身内单个对象或集合的内存请求,例如可以监视系统的类库? 如果是这样,我可以从代码本身内部监视连续的内存请求。

\n

Sea*_*kit 2

使用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;
    }
Run Code Online (Sandbox Code Playgroud)

您很可能有一些错误的代码,而不是实际的内存泄漏。- 内存泄漏是由于未关闭与资源的连接而不是代码引起的。汽水说...c# 垃圾收集将释放托管资源。

寻找 c# 静态对象... 您不应该在 Windows 服务中拥有任何对象,除非您确实知道它为什么存在以及它用作帮助程序。

Windows 服务通常用于轮询某些内容......在轮询工作中......除了帮助程序之外,不应该将任何静态类用于任何其他用途。

如果您提供更多有关 Windows 服务的功能的上下文......那么可以提出更好的建议。

附言。回答你的问题:red-gate 的 Ant Memory profiler 非常好。但我敢打赌,只要了解代码的作用,您就可以更快地找到它。