dotTrace Performance Profiler对[垃圾收集]的意义是什么?

Ste*_*nov 6 .net optimization garbage-collection dottrace

[垃圾收集]在这张照片中意味着什么?和"20个电话"的事情?

我的意思是,我怎么能弄清楚为什么GC花了这么长时间?它收集了很多小物件吗?一个大的?关于如何优化这一点的任何提示?

有问题的代码是:

private void DeserializeFrom(SerializationInfo info)
{
    Width = info.GetInt32("width");
    Height = info.GetInt32("height");
    var data = (List<byte>)info.GetValue("cells", typeof(List<byte>));
    cells = new Cell[physicalSize.Width, physicalSize.Height];
    int pos = 0;
    for (int x = 0; x < physicalSize.Width; x++)
    {
        for (int y = 0; y < physicalSize.Height; y++)
        {
            cells[x, y] = new Cell();
            if (x < Width && y < Height)
            {
                cells[x, y].HasCar = data[pos];
                pos++;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

没什么太花哨的.我怀疑罪魁祸首是大List<byte>对象,但我认为收集一个单一的大对象应该是即时的(而不是收集一堆小对象).

xmo*_*era 1

有点晚了,但如果您使用 .Net,那么您正在使用托管代码,这基本上意味着 .Net 运行时会相应地处理您的对象,因此与 C 或 C++ 不同,您不会出现内存泄漏。

垃圾收集是指运行时需要一些时间来管理应用程序的内存分配和释放。在这种情况下,这就是正在发生的事情。

请看一下这个可以与 doTrace 一起使用的过滤器(我有版本 6),以便您可以分析垃圾收集并确定它何时可能阻止您的执行。 https://www.jetbrains.com/profiler/help/CLR_Activity.html