C# 如何从代码中监视内存位置

C# 如何从代码中监视内存位置,c#,memory,memory-management,C#,Memory,Memory Management,我有一个windows服务,它最终会抛出一个“内存不足”异常。它是用C#编写的,在Windows7上运行 是,我已经阅读了有关堆栈内溢出的现有问题以及互联网上的其他地方。事实上,我发现Eric Lippert写的一篇很棒的文章“内存不足”并不是指物理内存,他在文章中对这种情况给出了非常清晰的解释 在这篇文章中,他提到“内存不足”时说:“这是一个用词不当的错误。这确实应该是一个“找不到足够的连续地址空间”错误;内存充足,因为内存等于磁盘空间。” 他还说: “内存不足”错误几乎从未发生过,因为没有

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

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

在这篇文章中,他提到“内存不足”时说:“这是一个用词不当的错误。这确实应该是一个“找不到足够的连续地址空间”错误;内存充足,因为内存等于磁盘空间。”

他还说:

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

当我查看PerfMon中的服务时,我看到内存下的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服务中有任何,除非你确实知道它为什么在那里,并且它被用作助手

Windows服务通常用于轮询某些内容。。。。在调查的工作中。。。除了helper之外,不应该使用任何静态类

如果您提供更多有关windows服务功能的上下文。。然后可以提出更好的建议

附:回答你们的问题:红门的蚂蚁内存分析器非常好。
但我敢打赌,只要理解代码的作用,您就可以更快地找到它。

这真的是一个32位的过程吗?这在现在应该很少见了。这是32位还是64位的应用程序?Visual Studio 2015有一个内存和cpu周期诊断工具,所以当你的代码运行时,你实际上可以逐行实时看到它。usr和Erik,这个应用程序是一个64位进程。Greg,很遗憾,由于公司的要求,我只在2013年发布。不过,听起来你说的是一个可以从VS访问的独立工具。我正在寻找可以放入代码本身的对象,这样即使在部署到现场后,它也可以进行自我诊断。Seabizkit,谢谢你的回复。PerformanceCounter正是我想要的。这实际上是针对其他人的代码,我通常关注静态成员以及不断增加的字符串大小。我会将此标记为已回答,再次感谢。