gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:21:59 25 4
gpt4 key购买 nike

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

在计时器的每个滴答声中,代码都会分配一个 IDisposable 对象(称为 SocketsMessageConnector)...但我确实正确地处理了它。

我运行 .NET Memory Profiler,每隔 60 秒我就会看到我的 SocketsMessageConnector 类的一个新实例在内存中徘徊(所以 15 分钟后,我有 15 个实例)。内存探查器验证该实例实际上已被释放,但它显示实例以 TimerCallback 为根,以 _TimerCallback 为根,以 GCHandle 为根...

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

附言。分析器在拍摄快照之前强制执行 2 次 GC,所以我知道这实际上是一次泄漏,而不仅仅是 GC 的优化。

最佳答案

仅仅因为它已被处置,并不意味着它已被垃圾收集。

尝试将计时器更改为每秒运行两次,然后让它运行 10 分钟。现在检查您的类对象中有多少仍在“内存中挥之不去”。如果你真的有内存泄漏,你将有 1200 个对象。但是,如果垃圾收集介入进来,您拥有的数量将大大减少 - 可能不到 100 个。

关于c# - 当我的计时器滴答作响时.......NET 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6034355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com