概括
我编写了一个以参数为参数的进程监视器命令行应用程序:
该程序所做的是监视所有具有传递名称或 pid 的进程,如果它们的 CPU 使用率超过阈值%,它会杀死它们。
我有两个类:
ProcessMonitor
和 ProcessMonitorList
前者,环绕
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 类中。我的问题:
最佳答案
所以我想我想通了。
使用 Reflector工具,我能够检查 System.Diagnostics
中的代码.
看来 NextValue
方法调用
GC.SuppressFinalization();
这意味着(我认为,如果我错了,请更正)我需要显式调用
Dispose()
在我所有的课上。所以,我所做的是实现
IDisposable
在我所有的课上,尤其是围绕 PerformanceCounter
的那一课.我写了更明确的清理我的
IList<PerformanceMonitor>
, 和内部,瞧,内存行为改变了。
它会振荡,但内存使用量在很长一段时间内明显介于可接受的范围之间。
关于memory-leaks - 如何解决 System.Diagnostics.PerformanceCounter 引起的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3266777/