Tengo una aplicación .Net Framework # 4.0 que realiza una gran cantidad de solicitudes web utilizando las clases WebRequest/WebResponse, ya que veo que tiene pérdida de memoria (o tal vez estoy haciendo algo mal) I escribió una pequeña aplicación sencilla que demuestra esto:WebRequest/WebResponse Memory leak
class Program
{
public static void Main(string[] args)
{
while(true)
{
var webRequest = (HttpWebRequest)WebRequest.Create("http://www.gooogle.com");
Init(webRequest);
using (var webResponse = (HttpWebResponse)webRequest.GetResponse())
{
var responseStream = webResponse.GetResponseStream();
responseStream.ReadTimeout = 30;
var streamReader = new StreamReader(responseStream, Encoding.UTF8);
var page = streamReader.ReadToEnd();
streamReader.Close();
streamReader.Dispose();
responseStream.Close();
responseStream.Dispose();
webResponse.Close();
Console.WriteLine("Done");
//GC.Collect();
}
}
}
private static void Init (HttpWebRequest webRequest)
{
webRequest.Method = "GET";
webRequest.Host = "www.gooogle.com";
webRequest.UserAgent =
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; GTB6.5; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; .NET4.0C; .NET4.0E; InfoPath.3) chromeframe/5.0.375.62";
webRequest.Accept =
"application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
webRequest.KeepAlive = true;
}
}
la única solución que subí es el uso GC.Collect() (sin marcar en el ejemplo), todos los objetos están dispuestos, todos los flujos están cerradas, soy yo Echando de menos algo ?
Encontré algo pero no entiendo el motivo, si minimizo la consola, el uso de memoria disminuye y se ve O.K, ¿cuál puede ser la razón de que haya un problema con Conosole o WinForm, cómo puedo solucionarlo?
¿Cómo ve que tiene una pérdida de memoria? –
Stream y StreamReader también implementan IDisposable. –
si GC.Collect() corrige su fuga, no es realmente una fuga. Es totalmente normal que el GC cuelgue a los recursos si no hay necesidad de liberarlos. ¿Ve las implicaciones de rendimiento cuando ejecuta su aplicación por un largo tiempo? ¿Algo no funciona como se esperaba debido al aumento en el uso de la memoria? ¿Perfilaron el uso de la memoria a lo largo del tiempo durante un período prolongado? – BrokenGlass