首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PerfView的GCStats和CollectionCount()结果的差异

PerfView的GCStats和CollectionCount()结果的差异
EN

Stack Overflow用户
提问于 2017-07-09 20:44:08
回答 1查看 214关注 0票数 0

我正在学习PerfView,并尝试了GCStats报告。我创建了一个简单的应用程序,它在堆上进行了大量内存分配:

代码语言:javascript
复制
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集合的数量是不同的。有人能解释一下,为什么数字不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,您可以确定为什么会有任何差异。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45000852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档