当GC开始时,是否有可能获得事件? 我想计时每个单独的GC,以便我可以确定服务器中的暂停是由于GC还是其他原因。
GC在运行时会暂停所有.NET线程,对吗?(除了它运行的线程,当然)。未托管的线程呢?
谢谢!
当GC开始时,是否有可能获得事件? 我想计时每个单独的GC,以便我可以确定服务器中的暂停是由于GC还是其他原因。
GC在运行时会暂停所有.NET线程,对吗?(除了它运行的线程,当然)。未托管的线程呢?
谢谢!
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,其中有“观察”(watches)的概念,您可以发送数值,并在日志工具中绘制它们的图形。我连续发送了0、1和0这些数值,这样就可以得到一条始终保持在0L的图形,但每次GC运行时会产生一个尖峰。再加上一个监视CPU使用率和内存使用情况的后台线程,就可以获得非常好的数据。
垃圾回收器不会发出任何事件,但您可以使用计时器并调用 GC.CollectionCount()
来查看何时发生了回收操作。
非托管线程不受GC影响。
您可以在性能监视器中查看GC性能,这里有一篇关于如何创建系统监视器的文章。我认为您可以以某种方式获取到GC的计数器。
这是GC使用的性能计数器的描述。