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