添加AddApplicationPart和EmbeddedFileProvider后内存泄漏

问题描述 投票:0回答:1

我有一个 ASP.NET Core 8.0 应用程序,我想将一些控制器移动到一个模块(单独的项目)中。为了实现这一点,我必须从以下位置更新启动:

services.AddControllersWithViews()
        .AddRazorRuntimeCompilation();

至:

var assembly = typeof(HomeController).Assembly;
services.AddControllersWithViews()
        .AddApplicationPart(assembly)
        .AddRazorRuntimeCompilation(options =>
            {
                options.FileProviders.Add(new EmbeddedFileProvider(assembly));
            });

当我启动应用程序时,这工作正常(它启动并且所有端点/视图都像以前一样可用),但在运行测试套件时遇到问题。

测试使用 xUnit 运行,并使用基类设置服务实例,然后使用 API 调用和浏览器实例来调用服务上的端点。对于每个测试,都会初始化服务的新实例。在更改之前,内存使用量约为 800MB,运行良好,但更改后,内存使用量上升至 13GB。这是一个包含 200 个测试的测试套件,在运行过程中内存逐渐增加。所以看起来,更改后,每次测试后都没有释放一些内存。

我尝试过的一些事情:

  • 使装配成为静态场
  • 尝试了各种不同的调用这些方法的顺序
  • 尝试在服务主机上添加dispose方法
  • 尝试分析内存使用情况,这并没有告诉我太多,但在内存快照中我看到很多“Razor Compilation”的东西回来了。但它没有给出明确的指标。我看到内存中有很多“实例”仍然活跃:

screenshot memory usage

我非常不知道这种变化如何导致内存泄漏,因此任何尝试的线索或想法将不胜感激。

razor memory-leaks asp.net-core-mvc asp.net-core-8
1个回答
0
投票

感谢@Guru Stron的评论,我尝试了以下更改,我删除了AddRazorRuntimeCompilation,所以现在的代码如下:

var mvcBuilder = services.AddControllersWithViews()
    .AddApplicationPart(assembly);

if (Options.IsDevelopment)
{
    mvcBuilder.AddRazorRuntimeCompilation();
}

services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
{
    options.FileProviders.Add(new EmbeddedFileProvider(assembly));
});

我所做的另一个更改是将“模块”项目更新为 Web 项目:

<Project Sdk="Microsoft.NET.Sdk.Web">
    <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
        <OutputType>Library</OutputType>

而不是之前的样子:

<Project Sdk="Microsoft.NET.Sdk">

我认为这就是造成差异的原因,因为当我这样做时,我实际上在其中一个视图中遇到了编译错误(命名空间到丢失的包)。 200 次测试的内存使用情况现在又回到了之前的水平。

因此,这些更改之一解决了问题,但无论如何,这两种更改都可能是这种情况的最佳实践。

© www.soinside.com 2019 - 2024. All rights reserved.