C# 为什么访问PerformanceCounter会导致gen2垃圾收集

C# 为什么访问PerformanceCounter会导致gen2垃圾收集,c#,.net,garbage-collection,C#,.net,Garbage Collection,当我从C#应用程序中访问某些性能计数器时,我看到一些奇怪的行为。例如,当我访问进程专用字节时,我似乎得到了很多第2代垃圾收集(对于其他进程计数器也是如此) 下面的程序演示了这一点。如果每8秒左右运行一次,我会看到gen2系列。如果删除_privateBytesCounter.NextValue(),则根本看不到任何gen2集合 有人能解释一下吗 我正在运行Visual Sudio 2015,目标是.NET 4.5.2 using System; using System.Threading.Ta

当我从C#应用程序中访问某些性能计数器时,我看到一些奇怪的行为。例如,当我访问进程专用字节时,我似乎得到了很多第2代垃圾收集(对于其他进程计数器也是如此)

下面的程序演示了这一点。如果每8秒左右运行一次,我会看到gen2系列。如果删除_privateBytesCounter.NextValue(),则根本看不到任何gen2集合

有人能解释一下吗

我正在运行Visual Sudio 2015,目标是.NET 4.5.2

using System;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Threading;

namespace Gen2Collections
{
    class Program
    {
        private static PerformanceCounter _privateBytesCounter;
        private static PerformanceCounter _gen2Counter;

        static void Main(string[] args)
        {
            _privateBytesCounter = new PerformanceCounter("Process", "Private Bytes", Process.GetCurrentProcess().ProcessName);
            _gen2Counter = new PerformanceCounter(".NET CLR Memory", "# Gen 2 Collections", Process.GetCurrentProcess().ProcessName);
            RunMonitor();
            Thread.Sleep(60000);
        }
        private static void RunMonitor()
        {
            Task.Run(() =>
            {
                while (true)
                {
                    _privateBytesCounter.NextValue();
                    Console.WriteLine(_gen2Counter.NextValue());
                    Thread.Sleep(1000);
                }
            });
        }
    }
}

很难追查,涉及到很多非托管代码。太多了,PerfCounter.dll异常大。性能计数器似乎可以诱导集合获得“准确”的数字。然而,机制非常模糊,除了ETW供应商之外,我看不到任何好的线索。非常丑陋的行为,你不想经常使用那个计数器。你可以在connect.microsoft.com上提交一个bug,如果你幸运的话,他们会告诉你更多。