如何解决windows多线程应用中的内存泄漏问题

时间:2010-12-01 05:35:06

标签: c# .net

实际上我正在使用多线程进行实时应用。

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

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

你能指导我这个吗?

提前致谢。

4 个答案:

答案 0 :(得分:2)

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

有很多选择:

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

启动应用程序后(连接了探查器),您需要在泄漏之前和之后拍摄内存快照,然后比较它们以查看剩下的内容。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

每次打开新的子窗口时内存是否会增加?如果是这样,打开并关闭其中的几个,然后使用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#中编写“实时应用程序”?

答案 3 :(得分:0)

任务管理器的内存编号并不总是那么犀利,但是这个小技巧可以欺骗这个数字......不适合生产。

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