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將週期大致相同的方式從文章的圖表將顯示,儘管列表本身(因此堆)將永遠不會以分配的字節收縮。