写了一个定时器,在每隔1小时,需要调用下面的方式,每次调用该方法,可能要调用上百次。但该定时器执行了多次之后,就报"System.OutOfMemoryException" 异常。 请问如何解决?
谢谢!
public class Files {
public static string GetWebPage(string url, string indata, string dataurl, Encoding encoding) {
string responseFromServer = null;
try
{
string postData = indata;
byte[] byteArray = encoding.GetBytes(postData);
WebRequest request = WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "text/xml";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse response = request.GetResponse();
dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
responseFromServer = reader.ReadToEnd();
reader.Close();
dataStream.Close();
response.Close();
}
catch (Exception ex)
{
StreamWriter excptswstream = new StreamWriter("c:\\11.txt", false, System.Text.Encoding.Default);
excptswstream.Write("数据读取错误:========"+ ex.Message); excptswstream.Close();
return "数据读取错误";
}
return responseFromServer; } }
内存溢出,是不是因为dataStream没有dispose?
之前已经改成dispose ,还是有这个问题
dataStream.Close(); 这种写法建议换成Using()这样的话,在报错后依然可以关闭连接。
StreamWriter excptswstream = new StreamWriter("c:\\11.txt", false, System.Text.Encoding.Default); excptswstream.Close(); 如果是多线程的运行的话,这行代码也可能导致流没有正确关闭
看代码的话,这个方法造成内存溢出的几率比较小,检查下其他代码有没有地方会造成资源未释放,频繁创建对象问题。
可以在异常的时候Dump看一下。
最后实在不行,强制回收,但不建议这样做,会造成GC处理混乱。 服务器的内存有多大?
8G的内存,理论上应试够用了吧?
你的上百次是异步还是同步的?
做的是一个C/S版的定时工具,在每隔1小时就要调用作业。每次调用作业,上面这个方法被调用上百次。
所以当作业调用多次之后就报引发类型为“System.OutOfMemoryException”的异常。
这问题该如何解决?
需不需要把GetWebPage改为实例方法,而非静态方法?
是不是这个静态方法被调用几百次后无法释放资源,最后导致内存溢出?
请各位帮忙看看呢,谢谢!