2016-06-11 68 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>配置元素时,背景垃圾回收不会引发通知。

相关问题