Csharp/C#教程:当我的计时器滴答… .NET内存泄漏分享


当我的计时器滴答… .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。

上述就是C#学习教程:当我的计时器滴答… .NET内存泄漏分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/961569.html

(0)
上一篇 2021年11月26日
下一篇 2021年11月26日

精彩推荐