【问题标题】:Memory Leak and Weak References内存泄漏和弱引用
【发布时间】:2023-04-09 22:27:01
【问题描述】:

我的一个应用程序出现了一个看起来像内存泄漏的问题(该应用程序会随着时间的推移使用更多内存,大约一周后它会挂起)。

我已经检测到并修复了一些与我编写的类相关的泄漏(比较使用 sos.dll 获取的堆转储很快就会发现它们),并且这些泄漏的数量不再增加。

目前,随着时间的推移,唯一显着增加的是 WeakReference 实例,它以每分钟 1,000 个新 WeakReference 实例的稳定速度增长。

我的代码没有直接使用WeakReference,我从不自己创建。

什么会导致创建这么多WeakReference 实例?

我正在使用 VB.NET、Visual Studio 2008 和 .NET 3.5

【问题讨论】:

  • 你在使用 ORM 吗? (如 Entity Framework、Linq-to-sql、NHibernate)你是 Web App 吗?
  • 您是否尝试过使用 Microsoft 的 CLR profiler 查看引用的内容?
  • 我的应用程序是本地应用程序(通过串行端口或 TCP 套接字与其他设备通信)。我使用的唯一 ORM 是 LINQ2SQL,这是一个不经常使用的辅助函数(除非用户专门调用该功能,否则不会被调用)。如果您认为可以,我可以将 ORM 部分完全从应用程序中删除以进行测试。
  • @Marc,不,我没有,我现在就去学习如何做,不知道这是可能的!
  • 既然您已经熟悉 SOS,您是否尝试过在其中一些 WeakReferences 上使用“gcroots”命令来确定是什么持有它们(因此可能也是首先创建它们的原因) ?

标签: .net vb.net memory-leaks weak-references


【解决方案1】:

是的,这是 VB.NET 程序集中的一个相当臭名昭著的泄漏。它是由跟踪使用 WithEvents 关键字声明的事件的弱引用引起的。完成此跟踪以支持“编辑并继续”。它为类中声明的每个 WithEvents 事件泄漏一个 WeakReference 实例。需要附加调试器才能释放这些 WeakReference 对象。

解决方法很简单。发布 Release 版本,而不是 Debug 版本。

【讨论】:

  • 这个问题解决了吗?另外,您能否提供一些关于为什么以及如何发生这种情况的更多细节?我在谷歌搜索时发现的唯一有用的东西就是这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2018-01-10
  • 2017-01-23
  • 1970-01-01
  • 2018-12-22
相关资源
最近更新 更多