当前位置: 代码迷 >> C# >> C# 多线程 内存溢出,该怎么解决
  详细解决方案

C# 多线程 内存溢出,该怎么解决

热度:77   发布时间:2016-05-05 02:59:00.0
C# 多线程 内存溢出
C#写了一个程序。
函数A 
{
操作..........
}
-----------------------------------------------
函数B
{
//声明线程调用函数A
Thread Thread1 = new Thread(new ThreadStart(函数A));
Thread1.Start();
}
-------------------------------------------------
然后,每隔一段时间调用函数B(差不多500毫秒一次),运行一段时间后就报System.OutOfMemoryException异常。但是定义线程调用A,执行完之后,应该就结束了,资源应该释放啊了,为啥还把内存溢出。
PS:自己试过指定线程大小Thread Thread1 = new Thread(new ThreadStart(函数A),1024 * 256);也会报内存溢出错误,只不过比之前的耗时长一些

------解决思路----------------------
1,优化代码逻辑,将循环内每次都要申请内存的操作提取到循环外面,每次循环都共用一块内存;(不是每种内存占用都能这么做)
2,手动gc。。。(性能低,不过可以平滑处理,比如100次循环手动回收一次)
3,限制内存使用频率,如果代码环境代码环境是多线程导致内存过多,就限制线程数量,如果是循环导致,就降低循环速度,比如加个thread.sleep等;
1效果最好,可惜不是什么时候都适用,2代码简单,可惜性能损坏高,3比较中庸肯定可用,但是会降低执行效率;

这是之前回答别人的,处理内存溢出的方式,只是他是循环你是多线程而已,性质是一样
------解决思路----------------------
[System.Runtime.InteropServices.DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
        public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
        /// <summary>
        /// 释放内存
        /// </summary>
        public static void ClearMemory()
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
            {
                Form2.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
            }
        }
  相关解决方案