【问题标题】:Asp.net Core not Collecting GarbageAsp.net Core 不收集垃圾
【发布时间】:2017-03-21 04:29:04
【问题描述】:

我似乎无法理解为什么 Asp.net 核心不收集垃圾。上周我让一个 Web 服务运行了几天,我的内存使用量达到了 20GB。 GC 似乎没有工作。因此,为了测试这一点,我编写了一个非常简单的 Web 方法,它返回大量字符串。该应用程序开始时仅使用 124MB,但每次我调用 web 方法时,内存使用量都越来越高,直到达到 411MB。如果我一直调用 web 方法,它会更高。但我决定停止测试。

有人知道为什么 GC 不工作吗?正如您从性能监视器中看到的那样,GC 被调用(图表上的黄色标记)。但它没有从内存中收集垃圾。我认为 GC 会急切地收集任何没有引用它的东西。

任何帮助将不胜感激。谢谢! :)

【问题讨论】:

  • 不要认为这是对垃圾收集的正确测试。因为 .net 在需要更多内存时会在内存中创建一个堆。但是,当它收集时,它不会立即减少堆。它会随着时间的推移做到这一点。因为与创建相比,释放堆更耗费资源。但是,它应该在多次调用时重用同一个堆。您可以尝试不使用异步吗?只是想看看发生了什么?
  • 嗨@HenrikBøgelundLavstsen,我已经删除了异步网络方法,并再次测试,但这次是同步方法。我仍然有同样的内存问题。所以这似乎不是一个异步问题。就像你说的,每次调用都应该重用相同的内存空间。但是每次通话都会增加内存使用量。这有点令人不安。
  • 我还用 IIS 和 Kestrel 进行了测试。不幸的是,它们都表现出相同的行为。
  • 我在 asp.net github 存储库上打开了一张票。希望我们能深入了解这一点。这是票的链接 => github.com/aspnet/Home/issues/1976#issuecomment-290685334

标签: c# asp.net .net asp.net-mvc asp.net-core


【解决方案1】:

我遇到了同样的问题,经过漫长的一天后,在one of the github issues 中找到了一个解决方案,注册为高内存消耗。

实际上,这是预期行为(在多核高内存机器中),称为“服务器”垃圾收集模式。此模式针对服务器负载进行了优化,仅在真正需要时(当机器开始缺乏内存时)运行 GC。

解决方法是将 GC 模式更改为“工作站”模式。 您可以通过向 .csproj 添加设置来完成此操作

<PropertyGroup>
  <ServerGarbageCollection>false</ServerGarbageCollection>
</PropertyGroup>

工作站模式意味着使用更少的内存但更频繁地运行 GC。

Sebastien Ros 在这里详细记录了这一点: https://github.com/sebastienros/memoryleak

在典型的 Web 服务器环境中,CPU 资源更为关键 比内存,因此使用服务器 GC 更适合。

【讨论】:

    【解决方案2】:

    服务器正在缓存输出,100,000,000 * 4 个字符 ~ 411MB。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2012-06-28
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      相关资源
      最近更新 更多