当物理> 95%时,为什么.NET不会将未使用的内存释放回操作系统?

cro*_*sek 5 c# iis wcf garbage-collection memory-management

我们正在测试4进程WCF IIS应用程序(x3发行版本)的内存稳定性(泄漏),只需每隔1秒ping一次,就像Load Balancer一样.如果服务器上没有运行其他任何东西,它运行正常> 12小时.

但是,如果我们故意减少总可用内存(修复页面,减少物理内存,启动其他应用程序)并将物理内存使用率提高到97%并将其保留5分钟或更长时间,Windows通常会检测到这种情况并关闭一个的过程.请注意,如果将内存推至97%(使用固定页面文件),它也会失败.

但是,使用RedGate工具分析其中一个幸存进程的内存占用情况,可以看出:

RedGate摘要选项卡

由于请求只是稳定的ping,因此当服务器缺乏时,.NET似乎没有实际的理由来保存269MB的可用内存.大约50%的IIS进程似乎处于此状态(~1.8GB).

该应用程序是针对.NET 4.0编译的,gcServer为true.IIS Gate检查设置为0%(minFreeMemoryPercentageToActivateService ="0"),尽管我们可能会将其设置为2%.

服务器是2008 R2,~4GB物理4GB固定页面,用4.0然后再测试4.5.1(无所谓).

@atanamir对类似问题回答是:

"一旦物理内存不足,.NET将把它的堆释放回操作系统."

任何人都知道该索赔的任何参考?它可能是特定版本的吗?

参考文献:

小智 5

这不是你问的问题(为什么)的答案,但它应该是实现你想要做的事情的一种方式.

.NET Framework 4.5有一些新功能 - 源代码

一旦站点运行,它使用垃圾收集器(GC)堆可能是其内存消耗的重要因素.与任何垃圾收集器一样,.NET Framework GC在CPU时间(集合的频率和重要性)与内存消耗(用于新的,释放的或可释放的对象的额外空间)之间进行权衡.对于以前的版本,我们提供了有关如何配置GC以实现正确平衡的指导.对于.NET Framework 4.5,可以使用工作负载定义的配置设置,而不是多个独立设置,它可以启用所有以前推荐的GC设置以及为每个站点工作集提供额外性能的新调整.例如,不需要设置gcServer,gcConcurrent等.

此外在这里他们陈述:

调整GC以实现高密度Web托管:GC可以影响站点的内存消耗,但可以调整它以实现更好的性能.您可以调整或配置GC以获得更好的CPU性能(减慢集合频率)或降低内存消耗(即更频繁的集合以更快地释放内存)[...]以便为每个站点实现更小的内存消耗(工作集)

要启用GC内存调整,请将以下设置添加到Windows\Microsoft.NET\Framework\v4.0.30319\aspnet.config文件和Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet.config文件中:

<configuration>
<!-- ... -->
<runtime>
<performanceScenario value="HighDensityWebHosting"  />
<!-- ... -->  
Run Code Online (Sandbox Code Playgroud)

基本上,基于我所做的测试,我发现它将消耗更多的CPU,更少的内存,并使GC在清理和内存释放过程方面更具侵略性.我们在基础架构(IIS 7.5,新的4.5框架)中测试了此设置,结果令人印象深刻.高内存使用导致内存不足异常不再是问题.

希望能帮助到你.