首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebRequest/WebResponse内存泄漏

WebRequest/WebResponse内存泄漏
EN

Stack Overflow用户
提问于 2010-12-07 09:24:32
回答 4查看 9.6K关注 0票数 11

我有一个.Net框架#4.0应用程序,它使用WebRequest/WebResponse类发出大量的web请求,因为我发现它有内存泄漏(或者我做错了什么),我写了一些简单的小应用程序来演示这一点:

代码语言:javascript
复制
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;
     }
}

我想出的唯一解决方案是使用GC.Collect() (在示例中未标记),所有对象都被释放,所有流都被关闭,我是不是遗漏了什么?

我发现了一些东西,但我不明白原因,如果我最小化控制台内存使用量减少,看起来还可以,是什么原因导致Conosole或WinForm有问题,我如何解决它?

EN

回答 4

Stack Overflow用户

发布于 2011-05-27 14:05:11

您在一个紧凑的循环中分配内存。您可能没有内存泄漏,您有一个行为糟糕的应用程序(从这个意义上讲,它无缘无故地占用了大量系统资源)。

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

一旦您的程序不再消耗所有可用的CPU时间,它应该允许GC更频繁地运行。

票数 5
EN

Stack Overflow用户

发布于 2010-12-07 10:52:33

试试这个:

代码语言:javascript
复制
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");
    }
}
票数 3
EN

Stack Overflow用户

发布于 2019-06-25 15:53:15

看看这个(source):

症状

当您使用HttpWebRequest类为HTTP POST或PUT请求发送大量数据时,在运行Microsoft .NET框架的计算机上请求可能会失败。此外,您可能会收到内存不足异常。

您可能会注意到,使用HttpWebRequest类的应用程序会消耗大量内存。当您使用性能监视器监视使用HttpWebRequest类的应用程序时,随着数据的发送,专用字节计数将继续增加。

导致

出现此问题的原因是,当您使用HttpWebRequest类时,默认情况下.NET框架会缓冲传出数据。知识文库文章http://support.microsoft.com/kb/908573记录了原始问题。

解析

要解决此问题,请将HttpWebRequest.AllowWriteStreamBuffering属性设置为false。这样做,POST或PUT请求的传出数据(实体主体)将不会在内存中缓冲。

在早于4.5的微软.NET框架版本中,将HttpWebRequest.AllowWriteStreamBuffering属性设置为false有时会在将数据上载到经过身份验证的终结点时导致错误。例如,您可能会遇到一个System.Net.WebException,其中显示消息"This request requires buffering data to succeed“。然而,在更深入的调查中,与异常关联的响应实际上表明状态代码为System.Net.HttpStatusCode.Unauthorized (401)。知识库文章http://support.microsoft.com/kb/908573记录了预身份验证和KeepAlive连接的解决方法,以处理401响应。

与微软.NET Framework1.1、2.0、3.0、3.5和4.0不同,微软.NET Framework4.5为HttpWebRequest.AllowWriteStreamBuffering属性添加了新的设计功能。只要启用了Expect100Continue功能,新功能就可以直接处理身份验证场景。缺省的ServicePointManager.Expect100Continue值为true.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4372591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档