我似乎无法理解为什么Asp.net核心没有收集垃圾。上周我让网络服务运行了几天,我的内存使用量达到了20GB。 GC似乎不起作用。所以为了测试这个,我写了一个非常简单的web方法,它返回一大堆字符串。该应用程序仅使用124MB启动,但每次调用Web方法时,内存使用量都会越来越高,直到达到411MB。如果我继续调用web方法,它会更高。但我决定停止测试。
有谁知道为什么GC不起作用?从性能监视器中可以看到GC被调用(图中的黄色标记)。但它没有收集内存中的垃圾。我认为GC会热切地收集任何没有引用它的东西。
任何帮助都将非常感激。谢谢! :)
答案 0 :(得分:1)
我遇到了同样的问题,经过漫长的一天,在one of the github issues中找到了一种解决方案,该解决方案注册了高内存消耗。
实际上,这是预期的行为(在多核高内存计算机中),称为“服务器”垃圾收集模式。此模式针对服务器负载进行了优化,并且仅在确实需要时(当计算机开始缺少内存时)才运行GC。
解决方案是将GC模式更改为“工作站”模式。 您可以通过将设置添加到.csproj
<PropertyGroup>
<ServerGarbageCollection>false</ServerGarbageCollection>
</PropertyGroup>
工作站模式意味着要使用较少的内存,但要更频繁地运行GC。
Sebastien Ros对此进行了详细记录: https://github.com/sebastienros/memoryleak
在典型的Web服务器环境中,CPU资源更为关键 而不是内存,因此使用Server GC更适合。
答案 1 :(得分:0)
服务器正在缓存输出,100,000,000 * 4个字符~411MB。