释放对象后,.NET Core应用程序进程内存不会减少

时间:2019-09-27 07:24:47

标签: c# memory-management .net-core asp.net-core-2.1

我在Windows上运行的ASP .NET Core 2.1应用程序遇到问题,这会增加其内存消耗,直到最终崩溃并要求终止.NET Core Host进程。我怀疑原因可能是每小时在后台运行一次同步任务,并且我已经确认禁用它可以解决问题。

我一直在使用VisualStudio 2019诊断工具来分析此同步任务,但发现了我不理解的行为:

enter image description here

如您所见,我已经拍摄了3张快照:

  1. 同步方法开始时
  2. 同步方法结束时
  3. 过一会儿,一旦存在范围

在快照表中,我看到了一个似乎对我来说合理的行为:在任务(2)期间,堆大小显着增加,在退出范围(3)时,堆大小几乎减小为初始大小(1)。但是,“ Process Memory”图表显示了一个不同的情况:内存消耗增加了,但从未减少。 我已经在发布模式下以dotnet run启动了该应用程序,并且在查看.NET Core Host进程使用的内存时看到了相同的行为。

我有两个问题:

  1. 为什么堆大小和进程内存之间存在这种差异?他们不应该密切相关吗?
  2. 这可能是导致我的webapp崩溃的原因吗?看起来是这样,但是内存消耗的增加应该是暂时的,直到崩溃时才是永久的。我该如何解决?

备注:我已经用一个没有依赖性的简单.NET Core控制台应用程序(2.1和2.2)重现了相同的行为,因此它没有链接到ASP部件或任何其他库: / p>

internal class Program
{
    private static void Main()
    {
        new Whatever().AllocateSomeStrings();
        // Snapshot3
        Console.ReadKey();
    }
}

public class Whatever
{
    public void AllocateSomeStrings()
    {
        // Snapshot1
        List<string> numbers = Enumerable.Range(0, 50000).Select(n => n.ToString()).ToList();
        // Snapshot2
    }
}

0 个答案:

没有答案