gpt4 book ai didi

c# - 为什么 .NET 在物理量 >95% 时不将未使用的内存释放回操作系统?

转载 作者:太空狗 更新时间:2023-10-29 23:06:52 26 4
gpt4 key购买 nike

我们正在测试一个 4 进程 WCF IIS 应用程序(x3 发行版)的内存稳定性(泄漏),方法是像负载均衡器一样每隔约 1 秒对它执行一次 ping 操作。如果服务器上没有其他任何运行,它可以正常运行 >12 小时。

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

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

RedGate Summary Tab

由于请求只是一个稳定的 ping,似乎没有实际理由让 .NET 在服务器不足时保留 269MB 空闲内存。大约 50% 的 IIS 进程似乎处于这种状态 (~1.8GB)。

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

服务器是 2008 R2,~4GB 物理 4GB 固定页面,先用 4.0 再用 4.5.1 测试(没关系)。

有一个answer to a similar question by @atanamir声称:

".NET will free its heap back to the OS once you're running low on physical memory."

有人知道该声明的引用资料吗?它可以是特定于版本的吗?

引用:

最佳答案

这不完全是对您提出的问题(为什么)的回答,但它应该是实现您想要做的事情的一种方式。

.NET Framework 4.5 有一些新东西 - source

Once a site is running, its use of the garbage-collector (GC) heap can be a significant factor in its memory consumption. Like any garbage collector, the .NET Framework GC makes tradeoffs between CPU time (frequency and significance of collections) and memory consumption (extra space that is used for new, freed, or free-able objects). For previous releases, we have provided guidance on how to configure the GC to achieve the right balance. For the .NET Framework 4.5, instead of multiple standalone settings, a workload-defined configuration setting is available that enables all of the previously recommended GC settings as well as new tuning that delivers additional performance for the per-site working set. For example, there is no need to set gcServer, gcConcurrent, etc.

还有 here他们说:

Tuning GC for high-density Web hosting: GC can impact a site’s memory consumption, but it can be tuned to enable better performance. You can tune or configure GC for better CPU performance (slow down frequency of collections) or lower memory consumption (that is, more frequent collections to free up memory sooner) […] in order to achieve smaller memory consumption (working set) per site

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

<configuration>
<!-- ... -->
<runtime>
<performanceScenario value="HighDensityWebHosting" />
<!-- ... -->

基本上,根据我所做的测试,我看到它会消耗更多的 CPU,更少的内存,并使 GC 在清理和内存释放过程方面更加积极。我们在我们的基础架构(IIS 7.5、新的 4.5 框架)中测试了此设置,结果令人印象深刻。导致内存不足异常的高内存使用率不再是问题。

希望对您有所帮助。

关于c# - 为什么 .NET 在物理量 >95% 时不将未使用的内存释放回操作系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28614210/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com