【问题标题】:Win from application gets slow从应用程序中获胜变得缓慢
【发布时间】:2011-11-11 08:31:27
【问题描述】:

我已经使用 Visual Studio .NET 构建了一个应用程序,它运行良好。应用程序使用超过 2-3 小时后,它开始变慢,我不知道为什么。我用GC.Collect(); 来解决内存泄漏问题,但现在我有了新的。 有谁知道解决办法吗?

【问题讨论】:

  • 如果没有更多细节和/或代码,您的问题可能过于宽泛而无法回答。未知因素太多;可能不会有一个简单而通用的解决方案。

标签: visual-studio-2010 memory-leaks performance


【解决方案1】:

如果你真的有内存泄漏,只调用GC.Collect() 会让你一事无成。 GarbageCollector 只能收集那些不再被其他人引用的对象。

如果你没有正确清理你的对象,GC 将不会收集任何东西。

在处理内存消耗时,您应该认真考虑以下模式:

  1. 弱事件 (MSDN Documentation here) 如果您不取消订阅事件,订阅对象将永远不会释放到垃圾收集中。 GC.Collect()删除这些对象,它们会使你的记忆变得混乱。

  2. 实现IDisposable接口(@98​​7654322@) (我强烈建议阅读这个文档,因为我看到了很多错误的实现。) 您应该始终释放您使用的资源。在每个提供它的对象上调用Dispose()

  3. 这同样适用于流。始终在提供此功能的每个对象上调用Close()

  4. 要使第 2 点和第 3 点更容易,您可以使用 using 块。 (MSDN documentation here) 一旦这些代码块超出范围,它们就会自动在给定对象上调用适当的Dispose()Close() 方法。这与使用try... finally 组合相同,但更方便。

【讨论】:

  • 由于我在调试中进行了部署,因此调试和发布是否有很大区别?在发布模式下构建设置是否更快?
  • 一般来说,RELEASE 模式下的应用程序会比 DEBUG 模式稍快一些,因为在 DEBUG 模式下,有很多奇特的东西在“幕后”进行,这些东西在部署为 RELEASE 时不会运行。但是对于 GarbageCollector,这不会产生太大影响。我认为这走错了方向。
【解决方案2】:

尝试使用内存分析器,例如 ANTS 内存分析器。首先,您需要了解发生了什么,然后您可以考虑如何解决它。

http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多