Есть гораздо более простой способ, если все, что вы хотите сделать, это выяснить, когда GC работает, он не скажет вам точно, когда он запускается, или вообще не когда он заканчивается, но если вы видите выходные данные этого метода Я опишу здесь, когда вы заметите паузы на своих серверах, вы сможете выяснить, является ли GC вашей проблемой.
По сути, вы создаете класс с финализатором, создаете объект этого класса и просто удаляете ссылку (т.е. не сохраняете ее). Затем объект будет оставлен до тех пор, пока GC не ударит его, где он будет завершен.
Хитрость заключается в том, что в финализаторе, который вы регистрируете (каким бы способом вы не захотели его использовать), запущен финализатор, и, если домен приложения не завершает работу, вы просто создаете новый объект, который вы быстро отбрасываете ссылка на, готов к следующему 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, но вызывал резкий всплеск всякий раз, когда выполнялся сборщик мусора. Сопоставьте это с фоновым потоком, который отслеживал использование процессора и использованную память, дал мне очень хорошие данные для работы.