由于调用了一个内存泄漏的Com组件, 导致垃圾无法回收, 试过用GC.Collect(), 不行...不过把windows窗体最小化了, 垃圾立刻就回收了. Winform最小化的内部机制是什么?

解决方案 »

  1.   

    关键是你如何调用com的,是否真正释放Com所占用的资源;
    其次GC回收内存是不确定的,显示调用GC.Collect只是有时会起到作用。
      

  2.   

    windows是优化前台程序的,最小化是把物理内存转到虚拟内存上去了,不过对于.net,也许他内部有机制清楚那些标记为无效的对象释放内存吧。但如果是.net中用非托管代码造成的内存泄漏,除了关闭程序,我觉得没有办法自动释放。最小化绝对不可能释放真正的内存泄漏。所以,你看到的是假相,要么那个com本身没有内存泄漏,要么根本没有释放。
      

  3.   

    同意楼上的最小化其实就是发送一个程序的handle 和一个windows的message。
    估计真正起作用的不应该是这个最小化,而是触发了其它东西。
      

  4.   

    com服务器应该不是managed代码,垃圾回收管不到它吧。
      

  5.   

    最小化时,只是设置了workset,楼主,只要这样搞一下就可以了:
    GC.GetTotalMemory(true);                    try
                        {
                            IntPtr pnMaxWorkset = new IntPtr(1048576 * 2);
                            IntPtr pnMinWorkset = new IntPtr(1048576 * 1);
                            System.Diagnostics.Process.GetCurrentProcess().MinWorkingSet = pnMinWorkset;
                            System.Diagnostics.Process.GetCurrentProcess().MaxWorkingSet = pnMaxWorkset;
                        }
                        catch (System.Threading.ThreadAbortException)
                        {
                            System.Threading.Thread.ResetAbort();
                            return;
                        }
                        catch (Exception ex)
                        {
                            Com.iFlytek.Framework.Log.TxtLogger.DumpException(ex);
                            continue;
                        }