2010-09-01 54 views
5

dotTrace性能分析器由[垃圾收集]表示的含義是什麼?

這張照片中的[垃圾收集]是什麼意思?和「20個電話」的東西?

我的意思是,我怎麼能弄清楚爲什麼GC花了這麼長時間?它收集了很多小物件嗎?一個大的?有關如何優化這一切的任何提示?

的代碼中的問題是:

private void DeserializeFrom(SerializationInfo info) 
{ 
    Width = info.GetInt32("width"); 
    Height = info.GetInt32("height"); 
    var data = (List<byte>)info.GetValue("cells", typeof(List<byte>)); 
    cells = new Cell[physicalSize.Width, physicalSize.Height]; 
    int pos = 0; 
    for (int x = 0; x < physicalSize.Width; x++) 
    { 
     for (int y = 0; y < physicalSize.Height; y++) 
     { 
      cells[x, y] = new Cell(); 
      if (x < Width && y < Height) 
      { 
       cells[x, y].HasCar = data[pos]; 
       pos++; 
      } 
     } 
    } 
} 

沒什麼特別的。我懷疑罪魁禍首是大List<byte>對象,但我想收集單,大對象應該是瞬間(相對於蒐羅了一堆的小物件)。

回答

1

有點遲到了,但如果你使用的是.NET,那麼你使用託管代碼,這基本上意味着,.NET運行時相應處置你的對象,所以你沒有內存泄漏,而不是C或C++ 。

垃圾收集是每當運行時需要花費時間來管理應用程序的分配和釋放內存。在這種情況下,就是發生了什麼。

請看一看這個過濾器,可以用doTrace(我有6版)中使用,這樣就可以分析垃圾收集和確定什麼時候可能會阻止您的執行。 https://www.jetbrains.com/profiler/help/CLR_Activity.html

+0

我意識到這是一個幾個月大,但我覺得這是值得一提的是,你絕對可以在.NET代碼的內存泄漏。靜態事件是這種情況的一個常見原因。如果您訂閱具有瞬態的靜態事件並且無法在釋放對瞬態的所有已知引用之前取消訂閱該事件,那麼瞬態將通過來自靜態事件的引用保持活動狀態;垃圾收集器將永遠不會收集它。 – Kelsie 2015-08-28 16:54:33

+0

@ kelsie你是對的,我沒有正確表達自己。關於如何使用非託管代碼進行編程,您沒有內存泄漏,因爲這很容易導致無法正確釋放對象並導致內存泄漏。同樣正如您正確地指出的那樣,事件是您可以保持對某個對象的引用的一種方式,因此它不會被丟棄。 – xmorera 2015-08-30 04:24:59

+0

其他可能性在4.5之前,當你的應用程序非常密集地使用在LOH中分配的數組並且在不能壓縮LOH之前,你可能會發現內存異常。 – xmorera 2015-08-30 04:26:20