<已启用 gcServer = "false" /> 在 ASP.Net MVC 5 上不起作用



背景:

  1. 我在Hostgator中托管了两个web应用程序。其中一个是MVC 5/EF 6/.Net 4.6.1,另一个是Web Api2/EF 6/.Net 4.6.1

  2. Hostgator将每个应用程序池的专用内存限制为250MB,如果达到限制,则回收应用程序池,如果在5分钟内回收5次,则停止应用程序池(快速故障电位(。

  3. 经过几天的研究,我可以说所有的DBContext都被处理掉了。托管内存约20MB,非托管内存约200MB。

  4. 由于我无法进入主机,我创建了一个页面来检索一些内存信息,结果是:

主机值

这是控制器中的代码(由于在托管服务器上没有权限,评论了两行(:

model.ProcessMem = proc.PrivateMemorySize64;
model.GCMemory = GC.GetTotalMemory(true);
model.IsGCServer = GCSettings.IsServerGC;
//model.CPUCounter = cpuCounter.NextValue();
//model.RAMCounter = ramCounter.NextValue();

我使用Ant探查器在本地机器上获取信息,结果是:

探查器快照

探查器时间轴

正如你所看到的,大部分内存都是由.Net预先分配的(我知道这比分配几个小部分更有效(,但这些未使用的内存是"的一部分;应用程序池进程内存";。我现在GC可以在需要时收集它们,但由于服务器还有几GB的内存,并且GC不知道应用程序池配置中的内存限制,所以它会忽略它,因为";还不需要";。

  1. 我的研究将我带入垃圾回收器模式(服务器/工作站(,因此它看起来像是解决方案,但当我将值更改为web.config时,它不会生效。在VS2017、本地IIS和主机上进行了测试

问题:

是否可以更改设置以使用Workstation GC?或者有没有办法提前限制.Net分配的私有内存?或者有什么办法保持低调?

相关帖子:

https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/gcserver-element

如何在Azure应用服务上运行的ASP.NET Framework应用程序中禁用服务器GC

作为自由空间的第1代堆消耗Gigs内存

如果您使用他们的共享主机,您无法更改您的私有内存限制,您需要要求他们为您更改。或者为了避免上述问题,也许您需要升级到更高的计划。请随时联系他们的支持,首先了解您遇到的问题

最新更新