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);
}
}