我正在学习PerfView,并尝试了GCStats报告。我创建了一个简单的应用程序,它在堆上进行了大量内存分配:
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
GcReport();
const int size = 10 * 1024 * 1024;
var list = new List<int>();
for (int i = 0; i < size; i++)
{
list.Add(i);
}
for (int i = 0; i < size; i++)
{
object obj1 = list[i];
object obj2 = list[i];
if (obj1 == obj2)
Console.WriteLine("Match found");
}
GcReport(); // <-- results are shown below
}
private static void GcReport()
{
Console.WriteLine($"Gen0: {GC.CollectionCount(0)}");
Console.WriteLine($"Gen1: {GC.CollectionCount(1)}");
Console.WriteLine($"Gen2: {GC.CollectionCount(2)}");
}
}下面是如何在PefrView中配置Run对话框:

下面是PerfView的GCStats报告:

下面是PerfView的日志文件,它显示了第二个GcReport()方法的结果:

如您所见,在PerfView的报告和Console Log结果中,GC集合的数量是不同的。有人能解释一下,为什么数字不同?
发布于 2017-07-10 15:49:37
报告中的主要区别是,GCReport显示每个确切生成的数量,而GC.CollectionCount显示特定世代或更高的GC数量。因此,GC.CollectionCount(0)是所有GCS (即Gen0,或Gen1或Gen2),并注意到他们在上面达成了一致。
与第2代的数量不一致(如果产出说第2代计数=3而不是4,则PerfView和计数将完全一致)。
这很容易是一些“边界”问题(第二代已经开始,但没有完成)。我只能在这一点上推测。不过,如果你愿意的话,你完全可以弄清楚这一点。创建一个EventSource (参见我的博客条目'Logging in C#:System.Diagnostics.Tracing.EventSource'),并在分配时经常记录GC计数。然后,您可以查看“事件”视图,并看到所有的GC和GCCounts,您可以确定为什么会有任何差异。
https://stackoverflow.com/questions/45000852
复制相似问题