[英]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.