【问题标题】:How to solve Memory leakage in windows multiple threading application如何解决 Windows 多线程应用程序中的内存泄漏问题
【发布时间】:2010-12-01 05:35:05
【问题描述】:

实际上我正在开发具有多个线程的实时应用程序。

当我运行应用程序时,内存为 65 Mb,如果我打开子 MDI 表单,内存会增加到 85mb,但如果我关闭子窗口,内存仍将保持在 85mb。

我使用过 Dispose 并且已经尝试过使用 GC.Collect(),但是这些都不能解决我的问题, 所以我对这个问题有点困惑。

你能指导我吗?

提前致谢。

【问题讨论】:

  • 请贴一些代码sn-p。您可能会忽略某些东西。
  • 您是否根据需要分离事件处理程序?
  • 你打算如何设置 MDIParent/显示子窗口?可以发一些代码吗?
  • 这是正常的。最小化您的主窗口以便快速修复。

标签: c# .net


【解决方案1】:

你需要一个好的内存分析器。

有很多选择:

许多都需要花钱(CLR Profiler 除外),但通常都有试用版。

在您启动您的应用程序后(附加分析器),您需要在泄漏之前和之后拍摄内存快照并比较它们以查看剩余的内容。

很难说你的问题可能是什么,因为有很多事情可能导致问题。

【讨论】:

    【解决方案2】:

    您是否在您的子 MDI 表单中使用了一些全局委托引用?

    【讨论】:

      【解决方案3】:

      每次打开新的子窗口时内存是否会增加?如果是这样,请打开和关闭其中几个,然后使用 windbg 附加到进程。

      加载 sos 后,您可以使用 !dumpheap 命令了解内存泄漏的可能位置,然后使用 gcroot 查找泄漏内存的根源。

      此博客可能会有所帮助: http://blogs.msdn.com/b/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-memory-leak.aspx

      顺便说一句,你是如何用 c# 编写“实时应用程序”的?

      【讨论】:

        【解决方案4】:

        任务管理器内存编号并不总是像它应该的那样清晰,但是这个小技巧可以欺骗这个数字......不适用于生产。

        public static void RefreshMemory() {
            try {
                Process curProc = Process.GetCurrentProcess();
                curProc.MaxWorkingSet = curProc.MaxWorkingSet;
            } catch {
                // Handle the exception
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-05-23
          • 1970-01-01
          • 2012-05-23
          • 2012-08-19
          • 1970-01-01
          • 2011-05-28
          相关资源
          最近更新 更多