『QQ:1353814576』

C#HttpClient频繁实例化请求接口出现内存泄露的解决办法


表现:软件内存随着时间慢慢增长无法释放

最近在再给自家程序进行了一次比较大的升级优化,运行效果也感觉挺不错的的于是前两天就给自家用户给升级上了。 但昨天无意间发现,软件占用的内存变得有些偏高了,按以往的情况来看软件正常运行期间的内存始终是保存在70到100MB以内的,但昨天却却已经占用到150M看着还隐约慢慢上涨的趋势,本次升级并没有添加什么比较占内存的功能,坑定不正常于是将程序重启,果然刚起来时内存只有70MB左右,但随着时间慢慢往上涨(每次的涨幅很小),今天再过来看果然内存已经上涨到180MB,这个问题折腾了一天。

c#HttpClient频繁实例化请求接口出现内存泄露的解决办法

原因:HttpClient的频繁实例化 每次都会有少许内存泄露

新升级的功能里新增了一个在线订阅功能 用到了HttpClient定时去服务器请求接口验证当前token,每次我都实例化了一个HttpClient并且使用了using进行回收 但就是回收不干净每次都会泄露一点点内存,短期问题不大,时间久了坑定会导致电脑内存不够用而崩溃,不知道为啥会这样。只是很奇怪的是,测试了好几台服务器 只有一台配置比较高的服务器会这样,其他的内存占用很低

有问题的写法

using (HttpClient http = new HttpClient()) 
{
     using (HttpResponseMessage response = http.GetAsync("https://www.baidu.com").Result) //向服务端发送请求
	 {
     Console.WriteLine($"HttpClient 状态码:{response.StatusCode}");
     string result = response.Content.ReadAsStringAsync().Result;//读取响应内容
     }
}

办法:HttpClient 设置成静态变量 不要每次都重新实例化

static HttpClient http => new HttpClient();

using (HttpResponseMessage response = http.GetAsync("https://www.baidu.com").Result) //向服务端发送请求
{
     Console.WriteLine($"HttpClient 状态码:{response.StatusCode}");
     string result = response.Content.ReadAsStringAsync().Result;//读取响应内容
}