Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 确定正在运行的垃圾收集器_.net_Garbage Collection - Fatal编程技术网

.net 确定正在运行的垃圾收集器

.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(

我正在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(Procmon在Win2k3服务器中不显示.Net仪器)。

您运行的是服务器版本的Windows,默认情况下,您将获得垃圾收集器的服务器版本。它不进行后台收集,垃圾由多个线程收集,因此偶尔可观察到的暂停并不罕见。您可以使用app.exe.config文件强制安装工作站版本:

<configuration>
   <runtime>
      <gcServer enabled="false"/>
   </runtime>
</configuration>

另外,请查看文档中的方法,以了解如何处理暂停的副作用


.NET 4.5版将支持服务器GC的后台集合。

我在我的博客上重新发布了这个答案:

您可以通过两种方法确定正在运行的GC版本:

  • 调用System.Runtime.GCSettings.IsServerGC属性
  • 使用WinDbg连接到进程,并使用命令“!sos.threads”检查有多少GC线程,但不带引号和(根据以下标准)
  • 你没有说你有什么样的应用。如果您正在运行控制台应用程序、WinForm应用程序或Windows服务,您将获得工作站GC。仅仅因为您在服务器OS上运行并不意味着您将获得GC的服务器版本。如果您的应用程序未托管在多进程计算机上,则默认情况下,您将获得工作站GC-Concurrent。如果您的应用程序托管在多进程计算机上,默认情况下,您将获得ServerGC

    默认情况下,任何IIS或CLR自托管应用程序都将在ServerGC模式下运行。

    以下内容适用于任何给定的.NET托管进程:

    工作站GC
    • 统一进程机
    • 总是挂起线程
    • 1个临时GC堆(SOH),1个LOH GC堆
    • 在触发GC的线程上运行
    • 线程优先级与触发GC的线程相同
    工作站GC-并发
    • 仅在Gen2/LOH(完整集合)中并发运行
    • 与服务器模式互斥
    • 稍大的工作集
    • 如果一段时间后不使用,GC线程将过期
    • 1个临时GC堆(SOH),1个LOH GC堆
    • 专用GC线程
    • 线程优先级正常
    服务器GC
    • 较大的段大小
    • 比工作站GC更快
    • 总是挂起线程
    • 每个逻辑处理器1个临时GC堆(SOH)(包括超线程),每个逻辑处理器1个LOH GC堆(包括超线程)
    • 专用GC线程
    • 线程优先级是线程优先级最高的
    无论GC模式如何,每个托管进程只有1个终结器线程。即使在并发GC期间,托管线程也会挂起(阻止)两次以执行GC的某些阶段

    一个鲜为人知的事实是即使您尝试设置GC的服务器模式,也可能没有在服务器GC中运行;GC最终确定哪种模式对您的应用程序是最佳的,如果它确定您的服务器GC设置将对您的应用程序产生负面影响,它将覆盖您的设置。此外,在单处理器计算机上运行的任何托管CLR应用程序都将覆盖任何手动GC设置-在这种情况下,CLR将始终使用工作站GC模式

    在CLR 4.0中,情况只发生了一点点变化
    • 并发GC现在是后台GC
    • 后台GC仅适用于工作站GC
    • 旧(并发GC):
      • 在完整GC期间,允许分配到临时段大小的末尾
      • 否则,将挂起所有其他线程
    • 新的(背景GC):
      • 如有必要,允许临时GC与背景GC同时进行
      • 性能要快得多
    • 服务器GC始终为任何生成的集合阻止线程
    在CLR 4.5中,情况只发生了一点点变化…再次发生
    • 后台服务器GC:
      • 服务器GC不再阻塞。相反,它使用专用的后台GC 可以与用户代码并发运行的线程-请参阅
    因此,在.NET4.5+中,所有应用程序现在都有可用的后台GC,而不管它们使用哪个GC

    .NET 4.7.1 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也没有