gpt4 book ai didi

c# - GC 启动和停止事件

转载 作者:太空狗 更新时间:2023-10-29 20:09:06 34 4
gpt4 key购买 nike

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 ,它具有“ watch ”的概念,您可以在其中发送数值,并在日志记录工具中绘制它们,我快速连续发送值 0、1 和 0,因为这会给我一个保持在始终为 0,但只要有 GC 运行就会产生尖峰。将其与监控 CPU 使用率和内存使用情况的后台线程相结合,为我提供了非常好的数据。

关于c# - GC 启动和停止事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1535855/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com