系统是一个多线程处理的,多个地方涉及多线程,包括列表更新,读取 还有很多临时的引用类型变量 
不知道哪里不对,内存一直慢慢攀升,请问 一般可能的原因是什么?怎么解决?

解决方案 »

  1.   

    真的没什么经验方面的提示吗?
    我习惯这样解决:
     Pre_lstVehicleInfo = null;
     Pre_lstVehicleState = null;有涉及多占用的用using  或者使用Disponse()
      

  2.   

    除非缺内存,否则GC是不会主动释放的。
    GC.Collect()?不推荐这个方式
      

  3.   

    如果非托管资源你都主动释放了,那就表示CLR认为按照你当前计算机的状况,可以分配更多的内存,可以在更晚的时候释放不再使用,托管的内存,你可以开启几个大的应用程序,然后观察一下,原来程序的内存增加是否停止,甚至减少。如果是这样的话,你完全不必担心所谓内存泄露的问题。在.net时代,内存泄露挺少发生的。
      

  4.   

    那要看你的程序是不是真的需要这些内存,如果需要,那就等程序运行完毕用GC.Collect,否则优化你的程序
      

  5.   

    可以用WinDbg。进程运行一段时间后(确认内存在持续增加),用WinDbg Attach进程,加载.NET调试库,执行DumpHeap命令,看哪个数据类型占用的内存多,再进一步分析可能泄露的原因。
      

  6.   

    每过一段时间 释放一下内存 #region 释放内存
            [DllImport("kernel32.dll")]
            public static extern bool SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
            public static void GarbageCollect()
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
            }        public static void FlushMemory()
            {
                GarbageCollect();            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                {
                    Form_Main.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
                }
            }
            #endregion