【问题标题】:Why this code is showing higher native memory consumption为什么此代码显示更高的本机内存消耗
【发布时间】:2017-09-21 18:18:30
【问题描述】:

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

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");
            }
        }
    }
}

当这个应用程序运行时,我还捕获了两个计数器Private Bytes# Bytes in all heaps。其结果如下所示。

根据article,图表应该如下所示。

我的问题是,为什么即使所有堆中的字节数几乎没有增加,私有字节也会增加?或者我的代码会导致出现在Private bytes 计数器中的任何本机泄漏?

【问题讨论】:

    标签: c# .net memory-management garbage-collection performance-monitor


    【解决方案1】:

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

    您正在分配new byte[...],但它永远不会超出范围,因此垃圾收集器不会收集它。这就是为什么private bytes 的人数不断增加。

    同样,byteArray 正在堆上分配并且不会超出范围。随着它的增长,它需要分配更多空间,但它会以块的形式增长,这就是为什么你在bytes in all heaps 中获得这些步骤。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 2023-03-31
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多