WebRequest/WebResponse内存泄漏

Rob*_*bob 9 .net c# asp.net

我有一个.Net Framework#4.0应用程序使用WebRequest/WebResponse类生成大量Web请求,因为我看到它有内存泄漏(或者我做错了)我写了一些小的简单应用程序来演示这个:

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;
     }
}
Run Code Online (Sandbox Code Playgroud)

我想出的唯一一个解决方案是使用GC.Collect()(在示例中没有标记),所有对象都被丢弃,所有流都被关闭,我错过了什么?

我找到了一些东西,但我不明白原因,如果我最小化控制台内存使用量减少,看起来没问题,可能是因为Conosole或WinForm存在问题,我该如何解决?

hem*_*emp 5

您正在紧密地分配内存。您可能没有内存泄漏,您的应用程序表现不佳(从某种意义上说,它无缘无故地消耗了很多系统资源。)

垃圾回收器不会中断循环以压缩释放的内存,除非由于内存压力而必须这样做。简单的解决方法是在循环的迭代之间引入延迟(可以像Thread.Sleep一样简单,尽管我不建议这样做。)

一旦您的程序无法正常工作以消耗所有可用的CPU时间,就应该允许GC更加频繁地运行。


Joh*_*ers 3

尝试这个:

while (true)
{
    var webRequest = (HttpWebRequest) WebRequest.Create("http://www.gooogle.com");
    Init(webRequest);
    using (var webResponse = (HttpWebResponse) webRequest.GetResponse())
    {
        using (var responseStream = webResponse.GetResponseStream())
        {
            responseStream.ReadTimeout = 30;
            using (var streamReader = new StreamReader(responseStream, Encoding.UTF8))
            {
                var page = streamReader.ReadToEnd();
            }
        }

        Console.WriteLine("Done");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 发生异常时“使用”是不一样的。 (3认同)