我有一个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,有没有办法以编程方式测量这些类型的统计信息?感谢。
答案 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>
配置元素后,后台垃圾收集不会引发通知。