如何以编程方式监视C#应用程序中的GC活动?

时间:2016-06-11 01:35:40

标签: c# .net memory garbage-collection clr

我有一个C#控制台应用程序,我希望以编程方式(不借助Visual Studio)监视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 API,有没有办法以编程方式测量这些类型的统计信息?感谢。

2 个答案:

答案 0 :(得分:1)

我不能说我知道的远远不足以直接帮助,但是当我好奇地寻找答案时,有几件事我拉了起来。希望根据“没有Visual Studio的帮助”的具体内容,这些事情并不是无关紧要的

这里还有另一个关于此问题的线索。 Monitoring Garbage Collector in C#

MSDN确实有一些关于它的文档。 https://msdn.microsoft.com/en-us/library/ee851764(v=vs.110).aspx

对我来说,垃圾收集器仍然是一个非常神秘的东西。

答案 1 :(得分:1)

如果您没有进行后台垃圾回收,可以使用基于事件的系统来接收garbage collection notifications

  

RegisterForFullGCNotification方法注册在运行时检测到完整垃圾收集即将到来时要引发的通知。此通知分为两部分:完全垃圾收集即将到来以及完整垃圾收集完成时。

请注意这不适用于背景收集的警告

  

仅阻止垃圾收集会引发通知。启用<gcConcurrent>配置元素后,后台垃圾收集不会引发通知。