memory-leaks - 如何解决 System.Diagnostics.PerformanceCounter 引起的内存泄漏

标签 memory-leaks system.diagnostics

概括

我编写了一个以参数为参数的进程监视器命令行应用程序:

  • 进程名称或进程 ID
  • CPU 阈值百分比。

  • 该程序所做的是监视所有具有传递名称或 pid 的进程,如果它们的 CPU 使用率超过阈值%,它会杀死它们。

    我有两个类:ProcessMonitorProcessMonitorList
    前者,环绕System.Diagnostics.PerformanceCounter后者是 IEnumarable这允许前者的类似列表的结构。

    问题

    该程序本身运行良好,但是如果我在任务管理器上查看内存使用情况,它会以每秒约 20kB 的增量增长。注意:程序通过PerformanceCounter轮询CPU计数器每一秒。

    这个程序需要在一个使用率很高的服务器上运行,并且它正在监视大量的进程。 (20-30)。

    调查至今

    我使用 PerfMon 来监控 私有(private)字节 进程与所有堆中的总字节数根据下面引用的文章中提出的逻辑,我的结果表明,在波动时,该值保持在可接受的范围内,因此没有内存泄漏:
    Article

    我还使用 FxCop 来分析我的代码,但它没有提出任何相关的信息。

    情节变厚了

    不习惯只是说,​​哦,那么没有内存泄漏,我进一步调查,发现(通过调试)以下代码行显示了泄漏发生的位置,箭头显示了确切的行。
    _pc = new PerformanceCounter("Process", "% Processor Time", processName);
    

    以上是 _pc 启动的地方,在我的 ProcessMonitor 的构造函数中类(class)。

    以下是导致内存泄漏的方法。每秒都会从我的 main 调用此方法。
    public float NextValue()
    {
            if (HasExited()) return PROCESS_ENDED;
            if (_pc != null)
            {
                _lastSample = _pc.NextValue();   //<-----------------------
                return _lastSample;
            }
            else return -1;
    }
    

    这表明 NextValue() 内部存在泄漏。方法,它位于 System.Diagnostics.PerformanceCounter 类中。

    我的问题:
  • 这是一个已知问题,我该如何解决?
  • 我假设任务管理器的内存使用量增加意味着确实存在内存泄漏正确吗?
  • 有没有更好的方法来监控特定进程的多个实例并在它们超过特定阈值 CPU 使用率时将其关闭,然后发送电子邮件?
  • 最佳答案

    所以我想我想通了。
    使用 Reflector工具,我能够检查 System.Diagnostics 中的代码.

    看来 NextValue方法调用

    GC.SuppressFinalization();
    

    这意味着(我认为,如果我错了,请更正)我需要显式调用 Dispose()在我所有的课上。

    所以,我所做的是实现 IDisposable在我所有的课上,尤其是围绕 PerformanceCounter 的那一课.

    我写了更明确的清理我的IList<PerformanceMonitor> , 和内部,
    瞧,内存行为改变了。

    它会振荡,但内存使用量在很长一段时间内明显介于可接受的范围之间。

    关于memory-leaks - 如何解决 System.Diagnostics.PerformanceCounter 引起的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3266777/

    相关文章:

    java - 匿名 Runnable 的这种特殊使用会导致内存泄漏吗?

    log4net - 如何让 FluentFTP 登录到 log4net 日志?

    C# System.Net 跟踪日志 - 只跟踪一种方法而忽略其他方法?

    c# - C#中的Process.Start()对非管理员用户不起作用

    c++ - System::String to char* 函数..内存泄漏?

    C、Xcode 和内存

    c# - 从代码中获取 dll 引用的项目名称

    C# 防止 ctrl-c 到子进程

    c++ - Visual Studio _CrtDumpMemoryLeaks 总是跳过对象转储

    C++:std::map的微小内存泄漏