2016-06-11 69 views
0

我有一個C#控制檯應用程序,我想以編程方式(不借助Visual Studio)監視GC活動。舉例來說,如果我有這樣的代碼:如何以編程方式監視C#應用程序中的GC活動?

public static void Main() 
{ 
    for (int i = 0; i < 100000; i++) AllocateByteArray(); 
} 

private static void AllocateByteArray() 
{ 
    new byte[1000]; 
} 

是否有使用GC類監控多少次循環運行時發生的垃圾收集方式?我最初嘗試是這樣的:

Console.WriteLine("Before:"); 
Console.WriteLine(GC.GetTotalMemory(false)); 

// do work... 

Console.WriteLine("After:"); 
Console.WriteLine(GC.GetTotalMemory(false)); 

Console.WriteLine("After collection:"); 
Console.WriteLine(GC.GetTotalMemory(true)); 

但我意識到測量並沒有真正告訴我什麼,因爲GC,而我在做的工作可能發生。我對.NET中的GC APIs不太熟悉,有沒有辦法以編程方式來測量這些類型的統計信息?謝謝。

+0

https://msdn.microsoft.com/en-us/library/w8f5kw2e(v=vs.110).aspx –

+0

附加GC相關閱讀:[每個人都認爲關於垃圾收集錯誤的方式(HTTPS: //blogs.msdn.microsoft.com/oldnewthing/20100809-00/?p=13203),[什麼時候一個對象可用於垃圾回收?](https://blogs.msdn.microsoft.com/oldnewthing/20100810 -00 /?p = 13193)以及當你知道的每件事都是錯誤的[Part 1](https://ericlippert.com/2015/05/18/when-everything-you-know-is-wrong-part-one/ )[第2部分](https://ericlippert.com/2015/05/21/when-everything-you-know-is-wrong-part-two/) – theB

回答

1

我不能說我的知識遠遠不夠直接有用,但是當我在好奇心中尋找答案時,我拉起了一些東西。希望這些東西不是無關緊要的關於「沒有Visual Studio的幫助」的具體一點

這裏還有另一個關於此的線程。 Monitoring Garbage Collector in C#

而MSDN確實有一些關於它的文檔。 https://msdn.microsoft.com/en-us/library/ee851764(v=vs.110).aspx

對我來說,垃圾回收器是一件很神祕的事情,依然。

1

如果您沒有進行背景垃圾回收,您可以使用基於事件的系統來接收garbage collection notifications

RegisterForFullGCNotification方法註冊一個通知,當運行時檢測到完整垃圾回收正在接近時引發。這個通知有兩個部分:當完整的垃圾收集正在接近時以及完整的垃圾收集完成時。

注意的警告,這並不爲背景收集

只有阻擋垃圾收集募集的通知工作。當啓用<gcConcurrent>配置元素時,背景垃圾回收不會引發通知。

相關問題