我目前正在开发一个类似插件的系统,它需要在运行时加载到程序集中。
根应用程序将作为windows服务运行,并将为每个“插件”创建一个IHost,以便每个插件都可以拥有自己的DI容器。
我开始对它进行压力测试,看看在停止/启动“插件”时是否有任何内存泄漏。停止/启动包括停止IHost并处理它,然后启动一个新的。我发现某个地方有一个小的内存泄漏。似乎每1000次重启我就增加了10-50mb。
这并不可怕,但它让我认为我没有正确地处理一些东西。我最终发现,仅仅启动/停止一个默认的IHost似乎也会导致类似的问题(尽管程度较小)。下面是一个简单的控制台应用程序,显示了我正在做的事情,你可以看到它只是缓慢但持续地占用内存。我可以看到GC正在运行,所以我认为它永远不会被清理。
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()之前添加以下内容来删除所有配置源,内存问题就会消失。
ConfigureAppConfiguration(config =>
{
config.Sources.Clear();
})这是我应该在https://github.com/dotnet/aspnetcore/issues中添加的一个问题吗?
发布于 2021-03-25 10:47:14
正如我在编辑中所说的,这看起来是由于配置设置造成的。
我做了一个issue on the ASP Net Core Github,但它看起来像是前几天其他人的already reported it。
似乎David Fowler已经在.Net 6预览版中添加了拉取请求,所以应该在.Net 6中修复这个问题。
https://stackoverflow.com/questions/66791228
复制相似问题