首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.Net 5 IHost FileSystemWatcher内存泄漏

.Net 5 IHost FileSystemWatcher内存泄漏
EN

Stack Overflow用户
提问于 2021-03-25 08:10:55
回答 1查看 76关注 0票数 2

我目前正在开发一个类似插件的系统,它需要在运行时加载到程序集中。

根应用程序将作为windows服务运行,并将为每个“插件”创建一个IHost,以便每个插件都可以拥有自己的DI容器。

我开始对它进行压力测试,看看在停止/启动“插件”时是否有任何内存泄漏。停止/启动包括停止IHost并处理它,然后启动一个新的。我发现某个地方有一个小的内存泄漏。似乎每1000次重启我就增加了10-50mb。

这并不可怕,但它让我认为我没有正确地处理一些东西。我最终发现,仅仅启动/停止一个默认的IHost似乎也会导致类似的问题(尽管程度较小)。下面是一个简单的控制台应用程序,显示了我正在做的事情,你可以看到它只是缓慢但持续地占用内存。我可以看到GC正在运行,所以我认为它永远不会被清理。

代码语言:javascript
复制
class Program
{
    private static async Task Main(string[] args)
    {
        while (true)
        {
            var host = Host.CreateDefaultBuilder().Build();
            await host.StartAsync();

            await host.StopAsync();
            host.Dispose();
        }
    }
}

这是内存快照。你可以看到有一些东西一直在积累。高亮显示的项目数量似乎与已出现的外观数量相匹配。

因此,在我看来,似乎在IHost中的某个时刻创建了一个文件监视器,但该文件监视器没有得到正确的处理。我猜可能是某个配置文件的问题?

我添加了WriteLine来跟踪已经发生的循环的数量,并运行了几分钟。应用程序开始时使用了大约10-20MB的内存,但在17000次循环之后,它达到了200mb+。这是在每个循环结束时调用GC.Collect和GC.WaitForPendingFinalizers。

我的问题是,这是否是一个问题。我是不是把它诊断为内存泄漏?

这可能不会影响我,因为我预计不会有数千次重启,但如果这真的是一个泄漏,那么在github上制造一个问题值得吗?

编辑:

我想我已经确认是内存泄露了。如果我通过在.Build()之前添加以下内容来删除所有配置源,内存问题就会消失。

代码语言:javascript
复制
ConfigureAppConfiguration(config =>
{
    config.Sources.Clear();
})

这是我应该在https://github.com/dotnet/aspnetcore/issues中添加的一个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-25 10:47:14

正如我在编辑中所说的,这看起来是由于配置设置造成的。

我做了一个issue on the ASP Net Core Github,但它看起来像是前几天其他人的already reported it

似乎David Fowler已经在.Net 6预览版中添加了拉取请求,所以应该在.Net 6中修复这个问题。

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

https://stackoverflow.com/questions/66791228

复制
相关文章

相似问题

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