gpt4 book ai didi

c# - 解除分配对象后,.NET Core 应用进程内存不会减少

转载 作者:行者123 更新时间:2023-12-04 13:57:54 24 4
gpt4 key购买 nike

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

我一直在使用 VisualStudio 2019 诊断工具分析这个同步任务,我发现了一个我不明白的行为:

enter image description here

如您所见,我拍摄了 3 个快照:

  • 同步方法开头
  • 末同步方法
  • 稍后,一旦我们存在范围

  • 在快照表中,我看到一个对我来说似乎合乎逻辑的行为:堆大小在任务 (2) 期间显着增长,并且在退出范围 (3) 时几乎减小到初始大小 (1)。然而,“进程内存”图表显示了一个不同的故事:内存消耗增加了,但它永远不会下降。
    我已使用 dotnet run 启动了该应用程序在 Release 模式下,我在查看 .NET Core Host 使用的内存时看到了相同的行为。过程。

    我有两个问题:
  • 为什么堆大小和进程内存之间存在这种差异?他们不应该是密切相关的吗?
  • 这可能是我的 web 应用程序崩溃的原因吗?看起来是这样,但内存消耗的增加应该是暂时的,而不是永久性的,直到它崩溃为止。我怎么能修好呢?

  • 备注:我用一个没有依赖项的简单 .NET Core 控制台应用程序(2.1 和 2.2)重现了相同的行为,所以这没有链接到 ASP 部分或任何其他库:
    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
    }
    }

    最佳答案

    回答我自己的问题:

  • 堆大小在创建对象时会增加,在被 GC 时会减少。堆大小增加时进程内存增加但是当堆大小减小时它不一定减小 .除非某些其他进程需要它(机器的可用内存变低),否则该内存可以一直分配给进程,从而迫使它被释放。这个过程不是由 GC 处理的,它在过程级别运行。另见:When is memory, allocated by .NET process, released back to Windows
  • 我发现根本问题是代码中的内存泄漏,while 循环写得不好,修复了崩溃的应用程序。
  • 关于c# - 解除分配对象后,.NET Core 应用进程内存不会减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58129758/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com