我有一个用C#编写的Windows服务。
运行几天后,它将使用大约2GB的内存。
使用“.NET Memory Profiler”我注意到某个T_TurbineEventLog类的实例数量大大增加。 这些对象来自一个循环,它通过LINQ-to-SQL查询每分钟获取它们(每次都有很多),在某些时候我会引用它们中的一些。
内存分析器告诉我,大多数这些对象只能通过类似于以下内容的最短根路径保持活动状态(来自我的记忆):
root - > ... - > T_TurbineEventLog - > PropertyChanged - > ...(eventhandlers) - > IdentityManager - > ...缓存 - > T_TurbineEventLog [] - > T_TurbineEventLog。
因此,对我来说,似乎我保留的少数T_TurbineEventLog对象有充分理由通过事件处理程序间接链接到原始SQL Query结果的整体(请记住,上面显示的是最短的根路径)。
我读了一个小using (var db=new MyDataContext...)
里面的对象,所以我猜datacontext应该取消订阅PropertyChanging事件,但由于某些原因没有。
我已经尽力了,但这似乎不是一个已知的问题。 那么我可以做错什么呢?
到目前为止,解决方案是设置ObjectTrackingEnabled=false
,这实际上消除了泄漏。