背景:
-
我在Hostgator中托管了两个web应用程序。其中一个是MVC 5/EF 6/.Net 4.6.1,另一个是Web Api2/EF 6/.Net 4.6.1
-
Hostgator将每个应用程序池的专用内存限制为250MB,如果达到限制,则回收应用程序池,如果在5分钟内回收5次,则停止应用程序池(快速故障电位(。
-
经过几天的研究,我可以说所有的DBContext都被处理掉了。托管内存约20MB,非托管内存约200MB。
-
由于我无法进入主机,我创建了一个页面来检索一些内存信息,结果是:
主机值
这是控制器中的代码(由于在托管服务器上没有权限,评论了两行(:
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不知道应用程序池配置中的内存限制,所以它会忽略它,因为";还不需要";。
- 我的研究将我带入垃圾回收器模式(服务器/工作站(,因此它看起来像是解决方案,但当我将值更改为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内存
如果您使用他们的共享主机,您无法更改您的私有内存限制,您需要要求他们为您更改。或者为了避免上述问题,也许您需要升级到更高的计划。请随时联系他们的支持,首先了解您遇到的问题