php多线程抓取多个网页(publicstaticexternintSetProcessWorkingSetSize比之前的耗时长一些--解决思路-)
优采云 发布时间: 2021-10-29 08:09php多线程抓取多个网页(publicstaticexternintSetProcessWorkingSetSize比之前的耗时长一些--解决思路-)
ThreadThread1=newThread(newThreadStart(Function A));
线程1.开始();
}
-------------------------------------------------
然后每隔一段时间(几乎每500毫秒一次)调用函数B,运行一段时间后报System.OutOfMemoryException。但是定义线程调用A,执行完后应该结束,应该释放资源,内存溢出。
PS:我试过指定线程大小 ThreadThread1=newThread(newThreadStart(function A), 1024*256); 也会报内存溢出错误,但是比上一个耗时更长
------解决方案----------------------
1、优化代码逻辑,将循环中每次需要申请内存的操作提取出循环外,每次共享一块内存;(并非每个内存使用都可以做到这一点)
2. 手动GC。. . (性能低,但可以顺利处理,比如100个周期手动恢复一次)
3.限制内存使用频率。如果代码环境代码环境是多线程导致内存过多,限制线程数,如果是循环引起的,降低循环速度,比如加一个thread.sleep等;
1 效果最好,但并不总是适用, 2 代码简单,但性能损失高, 3 比较温和,肯定可用,但会降低执行效率;
这是之前给别人的答案,内存溢出的处理方式,不过是循环,你是多线程的,性质是一样的
------解决方案----------------------
[System.Runtime.InteropServices.DllImport("kernel32.dll",EntryPoint="SetProcessWorkingSetSize")]
publicstaticexternintSetProcessWorkingSetSize(IntPtrprocess,intminSize,intmaxSize);
///
///释放内存
///
publicstaticvoidClearMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if(Environment.OSVersion.Platform==PlatformID.Win32NT)
{
表单2.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle,-1,-1);
}
}