当我的计时器滴答作响.... .NET内存泄漏

Jef*_*eff 7 .net c# multithreading timer

我有一个.NET System.Threading.Timer计时器,每隔60秒滴答一次,并在每个滴答声中引入内存泄漏.

在计时器的每个刻度上,代码分配一个IDisposable对象(称为SocketsMessageConnector)......但我确实正确处理它.

我运行了.NET Memory Profiler,每60秒我看到一个新的SocketsMessageConnector类实例在内存中停留(所以在15分钟后,我有15个实例).内存分析器验证实例是否已被释放,但它显示了一个以TimerCallback为根的实例,该实例以_TimerCallback为根,该查询以GCHandle为根...

什么在这里?为什么TimerCallback保持在每个计时器滴答上创建的新实例?

PS.在拍摄快照之前,探查器会强制2个GC,因此我知道它实际上是泄漏,而不仅仅是GC的优化.

All*_*n W 7

仅仅因为它被处理掉了,并不意味着它已被垃圾收集了.

尝试将计时器更改为每秒运行两次,然后让它运行10分钟.现在检查你的类对象中有多少仍然"在内存中挥之不去".如果你真的有内存泄漏,你将有1200个对象.但是如果Garbage Collection已经进入市场,那么你将会大大减少 - 可能不到100.

  • 在假设您有真正的内存泄漏之前尝试产生 OutOfMemory 异常是一个好主意。 (2认同)