【发布时间】: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