我一直在试图追踪(似乎是)在Azure中运行的ASP.NET核心应用程序中的内存泄漏。我在应用程序开始时收集了一个DMP,并在内存达到峰值时收集了一个DMP,然后它就停止并崩溃了。我正在尝试用PerfView破译DMP文件。我加载了第一个转储文件,然后加载了第二个转储文件,并做了一个比较。"By Name“选项卡的输出如下所示:

所以,第一个问题是:我没看错吧?这是不是告诉我有18,501个HttpClient实例?如果是的话,我的天哪。
我进入"RefTree“标签,这是我在那里看到的:

果不其然,似乎占了大部分的HttpClient来自LGAuthLib,这是我的库。
所以,我不理解的是,HttpClient是一个静态对象,在类库的静态构造函数中分配一次,然后在任何地方使用。怎么可能分配到18,000个呢?是否存在容纳静态对象的18,000个类库?我不知道这是怎么可能的,因为这个对象是在DI单例中分配的。
这就是为什么我不能百分之百确定我是否正确地理解了这个差异。我就是不明白这怎么会泄露出去。
对于那些一直盯着这些东西的专业人士来说,您是否100%确定HttpClient对象正在泄漏?
为了完整起见,下面是我使用HttpClient对象的方式:
public async Task<string[]> GetRolesForUserByUserNameAsync(string strUser)
{
var reqParams = new HttpRequestMessage(HttpMethod.Post, new UriBuilder(_config.ServerUri)
{
Path = EndpointGetRolesForUserByMicroService
}.Uri);
reqParams.Headers.Add("MicroService", CreateMicroServiceHeaderValue(EndpointGetRolesForUserByMicroService));
reqParams.Content = HttpClientExtensions.JsonContent(new { userName = strUser });
using (var resp = await _httpClient.SendAsync(reqParams).ConfigureAwait(false))
{
resp.EnsureSuccessStatusCode();
return (await resp.Content.ReadAsJsonAsync<string>().ConfigureAwait(false)).Split(',');
}
}下面是它的分配方式:
public sealed class AuthService
{
private static readonly HttpClient _httpClient;
static AuthService()
{
_httpClient = new HttpClient();
}
}发布于 2020-06-11 21:15:09
迁移到.NET核心3.0+修复了此问题。这肯定是框架中的一个问题。
https://stackoverflow.com/questions/55841520
复制相似问题