Rab*_*bit 7 c# events garbage-collection
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
}
}
Run Code Online (Sandbox Code Playgroud)
您所要做的就是调用.Register()方法.请注意,我使用SmartInspect作为我的日志记录工具,因此您希望替换涉及SiAuto其他内容的调用.
在另一个项目中,也使用具有"手表"概念的SmartInspect,您可以在其中发送数值,并在日志记录工具中绘制图形,我快速连续发送值0,1和0,因为这样给我一个始终保持在0的图形,但是当GC运行时会产生尖锐的尖峰.将此与监视CPU使用情况和使用内存的后台线程相结合,为我提供了非常好的数据.
这就是 Profiling API 的用途。请参阅ICorProfilerCallback2::GarbageCollectionStarted和GarbageCollectionFinished。
由于这是一个分析器,因此它显然不适合在生产系统上日常使用。但无论如何,听起来您对此主要感兴趣的是出于诊断目的。因此,可能值得检查一个商业分析器是否已经提供了此功能,或者性能计数器是否足够——编写您自己的分析器可能是一个非常重量级的解决方案!
| 归档时间: |
|
| 查看次数: |
1217 次 |
| 最近记录: |