C# 使用PerfView发现.NET内核中的内存泄漏

C# 使用PerfView发现.NET内核中的内存泄漏,c#,asp.net-core,memory-leaks,.net-core,C#,Asp.net Core,Memory Leaks,.net Core,我一直在努力追踪(似乎是)运行在Azure中的ASP.NET核心应用程序中的内存泄漏。我在应用程序启动时收集了一个DMP,在内存停止并崩溃之前,我在内存达到峰值时收集了一个DMP。我正在尝试使用PerfView破译DMP文件。我加载了第一个转储,然后加载了第二个转储,并进行了比较。“按名称”选项卡的输出如下所示: 所以,第一个问题是:我读对了吗?这是不是告诉我有18501个HttpClient实例?如果是的话,我的天啊 我进入“参照树”选项卡,我在那里看到: 可以肯定的是,似乎占据大部分的Ht

我一直在努力追踪(似乎是)运行在Azure中的ASP.NET核心应用程序中的内存泄漏。我在应用程序启动时收集了一个DMP,在内存停止并崩溃之前,我在内存达到峰值时收集了一个DMP。我正在尝试使用PerfView破译DMP文件。我加载了第一个转储,然后加载了第二个转储,并进行了比较。“按名称”选项卡的输出如下所示:

所以,第一个问题是:我读对了吗?这是不是告诉我有18501个HttpClient实例?如果是的话,我的天啊

我进入“参照树”选项卡,我在那里看到: 可以肯定的是,似乎占据大部分的HttpClient来自LGAuthLib,它是我的库

所以,我不明白的是,HttpClient是一个静态对象,在类库中的静态构造函数中分配一次,然后在任何地方使用。怎么可能分配18000个呢?是否存在18000个包含静态对象的类库?我不知道这怎么可能,因为该对象是在DI单例中分配的

这就是为什么我不能100%确定我是否正确阅读了这个差异。我只是不知道怎么会泄漏

对于那些关注这些事情的专业人士来说,您是否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(',');
    }
}

迁移到.NET Core 3.0+修复了此问题。它一定是框架中的一个问题。

您如何使用它基本上是无关紧要的。如果有18K个实例,我们需要查看它是如何创建的。我认为不处理
HttpRequestMessage
可能会导致一些问题,因此我补充说,如果我正确地看到了这些微小的图像,我认为您看到的是包含和排除的样本计数。任何类型的分析器都使用采样来进行分析,无论是CPU周期还是堆分配。你能澄清是什么让你认为你有内存泄漏吗?你可以点击图片,它会显示你的完整大小。我不确定是否表示内存泄漏。这就是我的问题所在——从PerfView中可以获取哪些信息?很多,而且真的太多了,无法在这里解释。如果我没记错的话,几乎没有“?”链接来解释专栏信息。
public sealed class AuthService
{
    private static readonly HttpClient _httpClient;

    static AuthService()
    {
        _httpClient = new HttpClient();
    }
}