Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在这种情况下会触发GC?_C#_.net_Garbage Collection_Clr - Fatal编程技术网

C# 为什么在这种情况下会触发GC?

C# 为什么在这种情况下会触发GC?,c#,.net,garbage-collection,clr,C#,.net,Garbage Collection,Clr,我正在创建一个包含大量项目的数组(项目数>2500)。数组保存具有以下程序所示结构的对象。 我观察到进程的“%Time-spend in-GC”峰值达到了一个很高的值。它从ArraySize=2500的值开始。对于低于2500的任何内容,花费在GC中的高百分比时间具有低值事实上,即使ArraySize=2499,计数器也没有显示任何增加。 性能计数器: 代码: namespace TestGC { 公共班级线 { 私有字符串_data1; 专用十进制数据2; 专用十进制数据3; 公共字

我正在创建一个包含大量项目的数组(项目数>2500)。数组保存具有以下程序所示结构的对象。
我观察到进程的“%Time-spend in-GC”峰值达到了一个很高的值。它从
ArraySize=2500的值开始。对于低于2500的任何内容,花费在GC中的高百分比时间具有低值事实上,即使ArraySize=2499,计数器也没有显示任何增加。


性能计数器:

代码:

namespace TestGC
{
公共班级线
{
私有字符串_data1;
专用十进制数据2;
专用十进制数据3;
公共字符串数据1
{
获取{return\u data1;}
设置{u data1=value;}
}
公共十进制数据2
{
获取{return\u data2;}
设置{u data2=value;}
}
公共十进制数据3
{
获取{return\u data3;}
设置{u data3=value;}
}
公共电话线()
{
}
}
公共类项目
{
公共const int Size=200;
专用线路[]_线路=新线[尺寸];
公共线路[]线路
{
获取{返回_行;}
设置{u行=值;}
}
}
公共类包
{
私人物品(u物品),;
公共软件包()
{
_项目=新项目();
对于(int i=0;i
GC可能正在重新分配资源。这是一些预期的行为。确实,我建议读一读。

但是问题是什么?为什么会有这种行为?为什么会触发GC?如果你指的是一个百分比,你的程序什么都不做,分配这2500个对象需要很短的时间,所以是的,在这种情况下,“你的应用程序运行时间的相对百分比”会很高。你有没有一个更好的例子,在同样高的使用率下花费更长的时间?试着把行作为一个结构。您不需要在结构数组中新建项。也可以试着把项目作为一个工具。这些课程有什么原因吗?此外,对于line include,使用一个ctor来传递值-这比使用三组更快。@LasseV.Karlsen这不是完全正确的,请尝试使用相同的程序,ArraySize的值小于2500(甚至是2499);在GC中花费的%时间几乎不值得注意
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();
        }
    }
}