.net 确定正在运行的垃圾收集器
我正在Windows Server 2003 x64(2x Xeon 4 core procs)上运行一个大型.net 4.0 x86应用程序,遇到了这样的问题:我的应用程序每天冻结2-3次30秒,然后恢复正常运行。该应用程序每周只重新启动一次,占用400-800 mb内存,因此我假设这些冻结是垃圾收集。我只是在日志中看到冻结,不是实时的,否则我会检查任务管理器以确认.net 确定正在运行的垃圾收集器,.net,garbage-collection,.net,Garbage Collection,我正在Windows Server 2003 x64(2x Xeon 4 core procs)上运行一个大型.net 4.0 x86应用程序,遇到了这样的问题:我的应用程序每天冻结2-3次30秒,然后恢复正常运行。该应用程序每周只重新启动一次,占用400-800 mb内存,因此我假设这些冻结是垃圾收集。我只是在日志中看到冻结,不是实时的,否则我会检查任务管理器以确认 我正在尝试找出哪个.Net 4 GC正在运行,以及如果没有,如何将GC切换到新的并发后台GC,或者如何确认这些GC实际上是GC(
我正在尝试找出哪个.Net 4 GC正在运行,以及如果没有,如何将GC切换到新的并发后台GC,或者如何确认这些GC实际上是GC(Procmon在Win2k3服务器中不显示.Net仪器)。您运行的是服务器版本的Windows,默认情况下,您将获得垃圾收集器的服务器版本。它不进行后台收集,垃圾由多个线程收集,因此偶尔可观察到的暂停并不罕见。您可以使用app.exe.config文件强制安装工作站版本:
<configuration>
<runtime>
<gcServer enabled="false"/>
</runtime>
</configuration>
另外,请查看文档中的方法,以了解如何处理暂停的副作用
.NET 4.5版将支持服务器GC的后台集合。我在我的博客上重新发布了这个答案: 您可以通过两种方法确定正在运行的GC版本:
- 统一进程机
- 总是挂起线程
- 1个临时GC堆(SOH),1个LOH GC堆
- 在触发GC的线程上运行
- 线程优先级与触发GC的线程相同
- 仅在Gen2/LOH(完整集合)中并发运行
- 与服务器模式互斥
- 稍大的工作集
- 如果一段时间后不使用,GC线程将过期
- 1个临时GC堆(SOH),1个LOH GC堆
- 专用GC线程
- 线程优先级正常
- 较大的段大小
- 比工作站GC更快
- 总是挂起线程
- 每个逻辑处理器1个临时GC堆(SOH)(包括超线程),每个逻辑处理器1个LOH GC堆(包括超线程)
- 专用GC线程
- 线程优先级是线程优先级最高的
- 并发GC现在是后台GC
- 后台GC仅适用于工作站GC
- 旧(并发GC):
- 在完整GC期间,允许分配到临时段大小的末尾
- 否则,将挂起所有其他线程
- 新的(背景GC):
- 如有必要,允许临时GC与背景GC同时进行
- 性能要快得多
- 服务器GC始终为任何生成的集合阻止线程
- 后台服务器GC:
- 服务器GC不再阻塞。相反,它使用专用的后台GC 可以与用户代码并发运行的线程-请参阅
.NET Framework 4.7.1对垃圾收集(GC)进行了更改,以提高分配性能,特别是对于大型对象堆(LOH)分配。这是由于架构更改将堆的分配锁拆分为2,用于小对象堆(SOH)和LOH。进行大量LOH分配的应用程序应该能够减少分配锁争用,并获得更好的性能。这些改进允许LOH分配,而后台GC(BGC)正在覆盖SOH。通常LOH分配器会在BGC扫描过程的整个过程中等待,然后才能满足分配内存的请求。这可能会影响性能。您可以在PerfView的GCStats中观察到这个问题,其中有一个“LOH分配暂停(由于后台GC)>200毫秒事件”表。暂停原因是“等待BGC释放线程列表”。此功能应有助于缓解此问题。您是否检查了app.config/web.config中的配置?为什么必须进行垃圾收集?我有几个星期都没有重新启动的应用程序(占用大量内存),freez也没有