C# 为什么这段代码显示出更高的本机内存消耗

C# 为什么这段代码显示出更高的本机内存消耗,c#,.net,memory-management,garbage-collection,performance-monitor,C#,.net,Memory Management,Garbage Collection,Performance Monitor,我创建了一个简单的测试应用程序,如下所示 using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace PerfMonTest { class Program { private static List<byte[]> byteArray = new List<byte[]>()

我创建了一个简单的测试应用程序,如下所示

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace PerfMonTest
{
    class Program
    {
        private static List<byte[]> byteArray = new List<byte[]>();
        static void Main(string[] args)
        {
            Console.WriteLine("start now");
            Console.ReadLine();
            Task t1 = Task.Factory.StartNew(() => { Program.ProcessData(); });

            
            Task.WaitAll(new Task[] { t1});
            Console.WriteLine("done ...");
            Console.ReadLine();
        }

        private static byte[] GetData()
        {
            return new byte[1024 * 1024 * 50];
        }

        public static void ProcessData()
        {
            for (int i = 0; i < 50000; i++)
            {
                byteArray.Add(GetData());
                Thread.Sleep(500);
                Console.WriteLine("GC Memory consumed:" + Convert.ToString((GC.GetTotalMemory(false) / (1024 * 1024))) + " MB");
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统线程;
使用System.Threading.Tasks;
命名空间性能测试
{
班级计划
{
私有静态列表byteArray=新列表();
静态void Main(字符串[]参数)
{
Console.WriteLine(“立即开始”);
Console.ReadLine();
taskt1=Task.Factory.StartNew(()=>{Program.ProcessData();});
Task.WaitAll(新任务[]{t1});
控制台。WriteLine(“完成…”);
Console.ReadLine();
}
私有静态字节[]GetData()
{
返回新字节[1024*1024*50];
}
公共静态void ProcessData()
{
对于(int i=0;i<50000;i++)
{
Add(GetData());
睡眠(500);
WriteLine(“GC内存消耗:+Convert.ToString((GC.GetTotalMemory(false)/(1024*1024)))+MB”);
}
}
}
}
当这个应用程序运行时,我还捕获了所有堆中的两个计数器
私有字节
#字节
。其结果如下所示

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace PerfMonTest
{
    class Program
    {
        private static List<byte[]> byteArray = new List<byte[]>();
        static void Main(string[] args)
        {
            Console.WriteLine("start now");
            Console.ReadLine();
            Task t1 = Task.Factory.StartNew(() => { Program.ProcessData(); });

            
            Task.WaitAll(new Task[] { t1});
            Console.WriteLine("done ...");
            Console.ReadLine();
        }

        private static byte[] GetData()
        {
            return new byte[1024 * 1024 * 50];
        }

        public static void ProcessData()
        {
            for (int i = 0; i < 50000; i++)
            {
                byteArray.Add(GetData());
                Thread.Sleep(500);
                Console.WriteLine("GC Memory consumed:" + Convert.ToString((GC.GetTotalMemory(false) / (1024 * 1024))) + " MB");
            }
        }
    }
}

根据这一点,图表应该如下所示。


我的问题是,为什么所有堆中的字节数几乎没有增加,但私有字节数却在增加?或者,我的代码可能会导致出现在
专用字节
计数器中的任何本机泄漏?

问题在于,您使用的是一个令人难以置信的人为测试,它与真实场景不匹配

您正在分配
新字节[…]
,但它从未超出范围,因此不会被垃圾收集器收集。这就是为什么
专用字节的行不断增加的原因

类似地,
byteArray
正在堆上分配,并且没有超出范围。随着它的增长,它需要分配更多的空间,但它是以块的形式增长的,这就是为什么在所有堆的
字节中都有这些步骤的原因

如果要定期从列表中删除条目,您会看到
私有字节
的循环方式与文章中的图表显示的方式大致相同,尽管列表本身(以及堆)在分配的字节中永远不会收缩