【问题标题】:Why is GC getting triggered in this situation?为什么在这种情况下会触发 GC?
【发布时间】:2013-06-05 14:31:09
【问题描述】:

我正在创建一个包含大量项目(项目数 > 2500)的数组。该数组保存具有下面程序中描述的结构的对象。
我观察到该过程的“%Time 花在 GC 中”达到了一个很高的值。它以ArraySize = 2500 开头。对于低于 2500 的任何情况,在 GC 中花费的高 %time 具有低值。 事实上,即使 ArraySize=2499,计数器也没有显示任何增加。

性能计数器:

代码:

namespace TestGC
{
    public class Line
    {
        private string _data1;
        private decimal _data2;
        private decimal _data3;

        public string Data1
        {
            get { return _data1; }
            set { _data1 = value; }
        }

        public decimal Data2
        {
            get { return _data2; }
            set { _data2 = value; }
        }

        public decimal Data3
        {
            get { return _data3; }
            set { _data3 = value; }
        }
        public Line()
        {
        }


    }


    public class Item
    {
        public const int Size = 200;
        private Line[] _lines = new Line[Size];

        public Line[] Lines
        {
            get { return _lines; }
            set { _lines = value; }
        }
    }

    public class Package
    {
        private Item _item;

        public Package()
        {
            _item = new Item();
            for (int i = 0; i < Item.Size; i++)
            {
                _item.Lines[i] = new Line();
            }
        }

        public Item Item
        {
            get { return _item; }
            set { _item = value; }
        }

    }

    class Program
    {
        private const int ArraySize = 2500;
        static Package[] array = new Package[ArraySize];
        static void Main(string[] args)
        {           
            Console.ReadLine();

            for (int i = 0; i < ArraySize; i++)
            {
                array[i] = new Package();
            }

            Console.ReadLine();
        }
    }
}

【问题讨论】:

  • 确实如此,但正确的问题是什么?
  • 为什么会出现这种情况?为什么会触发 GC?
  • 如果你指的是一个百分比,你的程序不会做任何事情,分配这 2500 个对象需要很短的时间,所以是的,在这种情况下,“你的相对百分比总应用程序运行时间”会很高。你有更好的例子,在相同的高使用率下需要更长的时间吗?
  • 尝试将 Line 作为结构体。您不需要在结构数组中新建项目。还可以尝试将 Items 作为结构。有没有理由让这些成为类?同样对于 line 包括一个 ctor 来传递值 - 这比使用三组更快。
  • @LasseV.Karlsen 这不完全正确,尝试相同的程序,ArraySize 的值小于 2500,(甚至 2499);花在 GC 上的时间百分比几乎不明显

标签: c# .net garbage-collection clr


【解决方案1】:

GC 可能正在重新分配周围的东西。这是一些预期的行为。我建议阅读Large Object Heap

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多