如何从代码监控内存分配

本文关键字:内存 分配 监控 代码 | 更新日期: 2023-09-27 18:13:34

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

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

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

在这篇文章中,他用这样的语句来指代"内存不足":"这在当今是用词不当。它真的应该是一个"无法找到足够的连续地址空间"错误;有足够的内存,因为内存等于磁盘空间"。

他还说:

"内存不足"错误几乎不会发生,因为没有足够的可用存储;正如我们所看到的,存储就是磁盘空间,而如今磁盘是巨大的。相反,发生"内存不足"错误是因为进程无法在其虚拟地址空间中找到足够大的连续未使用页面来进行请求的映射。

当我查看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#垃圾收集将释放托管资源。

查找c#静态对象…你不应该在windows服务中使用ANY,除非你真正知道它为什么在那里并且它被用作帮助器。

Windows服务通常用于轮询....在工作的投票中…除了帮助器之外,不应该使用任何静态类。

如果你提供更多的上下文关于你的windows服务是做什么的…然后可以提出更好的建议。

p。回答你的问题:red-gate的Ant Memory profiler非常好。但是我敢打赌,只要理解代码是做什么的,你就能更快地找到它。