首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PerfView发现.NET内核中的内存泄漏

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

Stack Overflow用户
提问于 2019-04-25 11:45:55
回答 1查看 446关注 0票数 2

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

所以,第一个问题是:我没看错吧?这是不是告诉我有18,501个HttpClient实例?如果是的话,我的天哪。

我进入"RefTree“标签,这是我在那里看到的:

果不其然,似乎占了大部分的HttpClient来自LGAuthLib,这是我的库。

所以,我不理解的是,HttpClient是一个静态对象,在类库的静态构造函数中分配一次,然后在任何地方使用。怎么可能分配到18,000个呢?是否存在容纳静态对象的18,000个类库?我不知道这是怎么可能的,因为这个对象是在DI单例中分配的。

这就是为什么我不能百分之百确定我是否正确地理解了这个差异。我就是不明白这怎么会泄露出去。

对于那些一直盯着这些东西的专业人士来说,您是否100%确定HttpClient对象正在泄漏?

为了完整起见,下面是我使用HttpClient对象的方式:

代码语言:javascript
复制
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(',');
    }
}

下面是它的分配方式:

代码语言:javascript
复制
public sealed class AuthService
{
    private static readonly HttpClient _httpClient;

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-11 21:15:09

迁移到.NET核心3.0+修复了此问题。这肯定是框架中的一个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55841520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档