热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HttpClientHandler/HttpClient内存泄漏

如何解决《HttpClientHandler/HttpClient内存泄漏》经验,为你挑选了1个好方法。

我有10到150个长生命类对象,可以调用使用HttpClient执行简单HTTPS API调用的方法.PUT调用示例:

using (HttpClientHandler handler = new HttpClientHandler())
{
    handler.UseCOOKIEs = true;
    handler.COOKIECOntainer= _COOKIEs;

    using (HttpClient client = new HttpClient(handler, true))
    {
        client.Timeout = new TimeSpan(0, 0, (int)(SettingsData.Values.ProxyTimeout * 1.5));
        client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", Statics.UserAgent);

        try
        {
            using (StringContent sData = new StringContent(data, Encoding.UTF8, contentType))
            using (HttpResponseMessage respOnse= await client.PutAsync(url, sData))
            {
                using (var cOntent= response.Content)
                {
                    ret = await content.ReadAsStringAsync();
                }

            }
        }
        catch (ThreadAbortException)
        {
            throw;
        }
        catch (Exception ex)
        {
            LastErrorText = ex.Message;
        }
    }
}

运行这些方法2-3个小时后,包括通过using语句正确处理,程序已经爬到1GB-1.5GB的内存,并最终因各种内存不足错误而崩溃.很多时候连接是通过不可靠的代理,因此连接可能无法按预期完成(超时和其他错误很常见).

.NET Memory Profiler已经指出这HttpClientHandler是主要的问题,声明它既有"具有直接委托根的Disposed实例"(红色感叹号)和"已经处置但仍未进行GC处理的实例"(黄色感叹号).探查器指示已经根植的代表是AsyncCallbacks,源自HttpWebRequest.

它还可能RemoteCertValidationCallback与HTTPS证书验证有关,因为它TlsStream是根目录中的"Disposed但not not GCed".

考虑到这一切 - 我怎样才能更正确地使用HttpClient并避免这些内存问题?我应该GC.Collect()每小时强迫一次吗?我知道这被认为是不好的做法,但我不知道如何回收这个不太适当处理的内存,并且这些短命对象的更好的使用模式对我来说并不明显,因为它似乎是.NET对象本身的一个缺陷.


更新 强制GC.Collect()没有效果.

进程的总管理字节数最多保持在20-30 MB左右,而进程总内存(在任务管理器中)继续爬升,表明存在非托管内存泄漏.因此,此使用模式正在创建非托管内存泄漏.

我已经尝试根据建议创建HttpClient和HttpClientHandler的类级别实例,但这没有明显的效果.即使我将这些设置为类级别,它们仍然会重新创建并且很少重复使用,因为代理设置通常需要更改.一旦请求启动,HttpClientHandler就不允许修改代理设置或任何属性,因此我不断重新创建处理程序,就像最初使用独立using语句一样.

HttpClienthandler仍然使用"直接委托根"来处理AsyncCallback - > HttpWebRequest.我开始想知道HttpClient是否可能不是为快速请求和短生命对象而设计的.没有尽头......希望有人建议使用HttpClientHandler可行.


记忆探测器镜头: 初始堆栈指示HttpClientHandler是根本问题,具有应该已经GC的304个实时实例

在此输入图像描述

在此输入图像描述



1> 小智..:

使用repr形式Alexandr Nikitin,我发现只有当你将HttpClient作为一个短暂的物体时,这似乎才会发生.如果你使处理程序和客户端长期存在,这似乎不会发生:

using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace HttpClientMemoryLeak
{
    using System.Net;
    using System.Threading;

    class Program
    {
        static HttpClientHandler handler = new HttpClientHandler();

        private static HttpClient client = new HttpClient(handler);

        public static async Task TestMethod()
        {
            try
            {
                using (var respOnse= await client.PutAsync("http://localhost/any/url", null))
                {
                }
            }
            catch
            {
            }
        }

        static void Main(string[] args)
        {
            for (int i = 0; i <1000000; i++)
            {
                Thread.Sleep(10);
                TestMethod();
            }

            Console.WriteLine("Finished!");
            Console.ReadKey();
        }
    }
}


感谢您深究这一点.不幸的是,HttpClient类不符合我的要求 - 由于公共代理的动态和不稳定性,通常需要重新创建对象.看来HttpClient对于短生命连接来说不是一个可行的解决方案 - 更改代理设置需要重新构建HttpClientHandler,从而重新构建HttpClient.无论哪种方式,物体应该能够在不泄漏的情况下根据需要长寿或短缺; 这肯定是HttpClient中的一个缺陷.
推荐阅读
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文探讨了在设置了HTTP客户端超时时间后,向HTTP服务器发送请求时出现两个请求的情况。其中一个请求正常,另一个请求无法获取请求参数。文章分析了可能导致此问题的原因,并提供了解决方案。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • 本文是一篇翻译文章,介绍了async/await的用法和特点。async关键字被放置在函数前面,意味着该函数总是返回一个promise。文章还提到了可以显式返回一个promise的方法。该特性使得async/await更易于理解和使用。本文还提到了一些可能的错误,并希望读者能够指正。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了markdown[软件代理设置]相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
dashan
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有