[英]GC start and stop events
GC启动时是否有可能获得事件? 我想为每个GC计时,以便我可以看到我的服务器中的暂停是由于GC还是其他原因。
GC在运行时暂停所有.NET线程,对吗? (当然,除了它运行的线程)。 非托管线程怎么样?
谢谢!
有一个更容易的方法,如果您想要做的就是在GC运行时弄清楚,它不会准确地告诉您何时开始,也不会告诉它何时结束,但是如果您可以看到此方法的输出我将会在此处描述当您注意到服务器上的暂停时,您应该能够确定GC是否是您的问题。
基本上,你要做的是创建一个带有终结器的类,构造该类的对象,然后删除引用(即不存储它)。 然后该对象将被保留,直到GC命中它,它将在那里完成。
现在的诀窍是你在终结器中记录终结器(以任何你想要的方式使用),除非appdomain正在关闭,你只需构造一个新的对象,你迅速删除引用,准备下一个GC。
这非常有效,并且您不需要做太多工作。
这是我使用的课程:
namespace PresentationMode
{
/// <summary>
/// This class is used to get a running log of the number of garbage collections that occur,
/// when running with logging.
/// </summary>
public sealed class GCLog
{
#region Construction & Destruction
/// <summary>
/// Releases unmanaged resources and performs other cleanup operations before the
/// <see cref="GCLog"/> is reclaimed by garbage collection.
/// </summary>
~GCLog()
{
SiAuto.Main.LogMessage("GARBAGE COLLECTED");
if (!AppDomain.CurrentDomain.IsFinalizingForUnload() && !Environment.HasShutdownStarted)
new GCLog();
}
#endregion
#region Public Static Methods
/// <summary>
/// Registers this instance.
/// </summary>
public static void Register()
{
#if DEBUG
if (SiAuto.Si.Enabled)
new GCLog();
#endif
}
#endregion
}
}
您所要做的就是调用.Register()
方法。 请注意,我使用SmartInspect作为我的日志记录工具,因此您希望将涉及SiAuto
的调用替换为其他内容。
在另一个项目中,也使用具有“手表”概念的SmartInspect ,您可以在其中发送数值,并在记录工具中绘制图形,我快速连续发送值0,1和0,因为这样给我一个始终保持在0的图形,但是当GC运行时会产生尖锐的尖峰。 将此与监视CPU使用率和使用的内存的后台线程相结合,为我提供了非常好的数据。
这就是Profiling API的用途。 请参阅ICorProfilerCallback2 :: GarbageCollectionStarted和GarbageCollectionFinished 。
由于这是一个分析器,它显然不适合生产系统的常规使用。 但听起来你对这个主要感兴趣的是用于诊断目的。 所以可能值得检查其中一个商业剖析器是否已经提供此设施,或者perfmon计数器是否足够 - 编写自己的剖析器可能是一个非常重量级的解决方案!
GC不会发出任何事件,但您可以使用计时器并调用GC.CollectionCount()
来查看集合何时发生。
.net 4具有可能对您有用的垃圾收集事件 。
非托管线程不受GC影响。
您可以在性能监视器中查看GC性能,以下是有关如何创建系统监视器的文章。 我想你可以以某种方式得到GC的反击。
以下是GC使用的perf计数器的说明
您可以使用CLR Hosting准确地监视和测量GC暂停。 您可以在这篇文章中找到一个完全相同的例子: 准确测量GC悬浮液 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.