目录
介绍
最近看到一篇关于内存的泄露原因查找的文章,最后发现是因为HttpClient的使用不当造成的。这里做一些简单的记录,以防止以后遇到相同的问题不知道怎么处理。原文中是将HttpClient的实例作为局部变量,在使用的时候进行创建,因为业务原因——需要高并发的处理相关问题,所以导致HttpClient的实例不断的被创建,最终导致内存泄漏。
HttpClient 的用法
以下是微软建议:
HttpClient可以复用,但在高吞吐的应用中,也应该复用,否则可能造成Socket资源紧张,因为Socket关闭后,根据TCP协议的安全指引,要‘冷处理’一会后,才能被重新使用,Windows下可以是2分钟/4分钟。
这是个使用建议:
HttpClient仅可在应用程序的整个生命周期中实例化一次并重复使用。以下情况可能会导致SocketException错误:
-
为每个请求创建一个新的HttpClient实例。
-
负载较重的服务器。
-
为每个请求创建新的HttpClient实例可能会耗尽可用的套接字。
那么,既然找到了原因,更改就比较简单了,把在函数内的HttpClient实例拿到类里,变成静态成员即可。
如下:
private static HttpClient httpClient = new HttpClient();
是的,这样就可以了。