为了账号安全,请及时绑定邮箱和手机立即绑定

哪些策略和工具可用于发现.NET中的内存泄漏?

哪些策略和工具可用于发现.NET中的内存泄漏?

元芳怎么了 2019-10-24 10:47:30
我写了10年的C ++。我遇到了内存问题,但是可以通过合理的努力解决它们。在过去的几年中,我一直在编写C#。我发现我仍然遇到很多内存问题。由于不确定性,它们很难诊断和修复,并且由于C#的理念是,当您一定要这样做时,您不必担心这些事情。我发现的一个特殊问题是,我必须明确地处置和清理代码中的所有内容。如果我不这样做,那么内存探查器并没有真正的帮助,因为有太多杂乱无章的东西浮在水面,您无法在他们试图向您展示的所有数据中找到泄漏。我想知道我是否有错误的主意,或者我拥有的工具不是最好的。什么样的策略和工具对于解决.NET中的内存泄漏有用?
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

我们在项目中使用了Red Gate软件的Ants Profiler Pro。它对于所有基于.NET语言的应用程序都非常有效。


我们发现.NET垃圾收集器在清理内存中的对象(应该如此)方面非常“安全”。它会保留对象,只是因为我们将来可能会使用它。这意味着我们需要更加注意内存中膨胀的对象数量。最后,我们将所有数据对象转换为“按需扩展”(就在请求字段之前),以减少内存开销并提高性能。


编辑:这是对我所说的“按需膨胀”的进一步解释。在数据库的对象模型中,我们使用父对象的属性来公开子对象。例如,如果我们有一些记录以一对一的方式引用了其他“详细”或“查找”记录,那么我们将这样构造它:


class ParentObject

   Private mRelatedObject as New CRelatedObject

   public Readonly property RelatedObject() as CRelatedObject

      get

         mRelatedObject.getWithID(RelatedObjectID)

         return mRelatedObject

      end get

   end property

End class

我们发现,当内存中有很多记录时,上述系统会产生一些实际的内存和性能问题。因此,我们切换到一个系统,在该系统中,仅在请求对象时才夸大对象,并且仅在必要时才进行数据库调用:


class ParentObject

   Private mRelatedObject as CRelatedObject

   Public ReadOnly Property RelatedObject() as CRelatedObject

      Get

         If mRelatedObject is Nothing

            mRelatedObject = New CRelatedObject

         End If

         If mRelatedObject.isEmptyObject

            mRelatedObject.getWithID(RelatedObjectID)

         End If

         return mRelatedObject

      end get

   end Property

end class

事实证明,这样做的效率要高得多,因为对象一直保留在内存中,直到需要它们为止(访问Get方法)。它在限制数据库命中方面提供了极大的性能提升,并在内存空间上获得了巨大的收益。


查看完整回答
反对 回复 2019-10-24
  • 3 回答
  • 0 关注
  • 530 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信