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

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

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

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

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

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

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

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