1

我已经创建了一个简单的测试应用程序,如下所示。为什么此代码显示较高的本机内存消耗

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。其结果如下所示。

enter image description here

根据这一article,该图应该看起来像下面。 enter image description here

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

回答

2

问题是,你正在使用一个令人难以置信的人为测试,它不符合现实世界的情况。

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

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

如果你定期从列表中删除条目,你会看到private bytes将周期大致相同的方式从文章的图表将显示,尽管列表本身(因此堆)将永远不会以分配的字节收缩。

相关问题