代码之家  ›  专栏  ›  技术社区  ›  Stefan Monov

dotTrace Performance Profiler所说的[垃圾收集]是什么意思?

  •  5
  • Stefan Monov  · 技术社区  · 15 年前

    在这张图片中[垃圾收集]是什么意思?“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++;
                }
            }
        }
    }
    

    没什么特别的。我怀疑罪魁祸首是大人物 List<byte> 反对,但我想 单身,大 对象应该是即时的(而不是收集一堆小对象)。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Maria    11 年前

    如果你想知道是什么导致了GCs,分配和收集了哪些对象,你可以通过dotMemory来完成。下面是一个教程,解释了如何优化内存流量: https://confluence.jetbrains.com/display/NETCOM/Tutorial+3+-+How+to+Optimize+Memory+Traffic+with+dotMemory

        2
  •  1
  •   xmorera    11 年前

    派对有点晚,但如果你正在使用。Net那么您使用的是托管代码,这基本上意味着。NET运行时相应地处理对象,因此与C或C++相比,没有内存泄漏。

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

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