[Garbage collection]在dotTrace性能分析器中是什么意思?

7

在这张图片中,[Garbage collection]指的是什么?还有“20次调用”是什么意思?

我的意思是,我怎样才能找出为什么垃圾回收花费了这么长时间?是因为收集了很多小对象?还是一个大对象?有没有任何提示可以优化这个问题呢?

相关的代码如下:

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++;
            }
        }
    }
}

没有太多花哨的东西。我怀疑罪魁祸首是大型的List<byte>对象,但我认为收集一个单个的、大的对象应该是瞬间完成的(与收集一堆小对象相比)。

2个回答

2

1
如果你正在使用 .Net,那么你就在使用托管代码,这基本上意味着 .Net 运行时会相应地处理你的对象,因此你不会像 C 或 C++ 那样出现内存泄漏。
垃圾回收是运行时为应用程序管理分配和释放内存的时间。在这种情况下,这就是正在发生的事情。
请查看此过滤器,它可以与 doTrace(我有版本 6)一起使用,以便您可以分析垃圾回收并确定何时可能会阻止您的执行。https://www.jetbrains.com/profiler/help/CLR_Activity.html

我知道这篇文章已经发布几个月了,但我认为值得一提的是,在 .net 代码中绝对存在内存泄漏的可能性。静态事件是其中非常常见的原因之一。如果你使用瞬态对象订阅了一个静态事件,并在释放所有已知瞬态对象引用之前未取消订阅该事件,那么该瞬态对象将被静态事件的引用保持活动状态;垃圾回收器将永远不会回收它。 - Kelsie
@kelsie,你说得对,我表达不够准确。在使用非托管代码编程时,如果没有正确释放对象,就会出现内存泄漏问题。但是,正如你所指出的,事件是一种可以保留对对象引用的方式,以防止其被释放。 - xmorera
另一个可能性是在4.5之前的版本中,当您的应用程序在使用分配在LOH中的数组方面非常密集时,由于以前无法压缩LOH,因此可能会出现内存不足异常。 - xmorera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接