GC.RegisterForFullGCNotification、GC.WaitForFullGCApproach、GC.WaitForFullGCCompleteの各メソッドを使用して、今後のガベージコレクションから情報を取得しています。GC.WaitForFullGCApproachは、次のようにループする別のスレッドにあります。
while (!gcAbort)
{
GCNotificationStatus s = GC.WaitForFullGCApproach(10 * 60 * 1000);
if (s == GCNotificationStatus.Succeeded)
{
Console.WriteLine(GCState.Approaching, "GC is approaching ... ");
gcApproachNotificationCount++;
}
else
{
if (s == GCNotificationStatus.NotApplicable)
{
Console.WriteLine("Concurrent garbage collection is enabled, or the time specified for the millisecondsTimeout parameter has expired and no garbage collection notification was obtained.");
continue;
}
else
{
Console.WriteLine("Unexpected GCNotificationStatus " + s);
break;
}
}
if (forceGCWhenApproaching)
{
int maxGenCollectionCountBefore = GC.CollectionCount(GC.MaxGeneration);
Thread.Sleep(12000);
int maxGenCollectionCountAfter = GC.CollectionCount(GC.MaxGeneration);
if (maxGenCollectionCountBefore == maxGenCollectionCountAfter)
{
Console.WriteLine("Inducing forced Gen {0} GC.. Collection count is {1}".FormatWith(GC.MaxGeneration, maxGenCollectionCountBefore));
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, false);
}
else
{
Console.WriteLine("GC was already triggered by the system! Old collection count was {0}; new count is {1}".FormatWith(maxGenCollectionCountBefore, maxGenCollectionCountAfter));
}
}
// Check for a notification of a completed collection.
s = GC.WaitForFullGCComplete(10 * 60 * 1000);
if (s == GCNotificationStatus.Succeeded)
{
Console.WriteLine(GCState.Okay, "GC completed.");
}
else
{
Console.WriteLine(GCState.Unknown, "Unexpected GCNotificationStatus: " + s);
break;
}
}
問題は、すべてのガベージコレクションについて通知されないことです。だから時々私はこのようなものを見るでしょう:
GC is approaching ...
GC was already triggered by the system! Old collection count was 19; new count is 23
GC completed.
GC is approaching ...
GC was already triggered by the system! Old collection count was 33; new count is 37
GC completed.
つまり、コレクション数23から33の間で、すべてを見逃してしまいました。
web.configファイルで、並行GCを無効にしました。
<runtime>
<gcConcurrent enabled="false" />
</runtime>
GC.RegisterForFullGCNotificationについて、複数のしきい値を試しましたが、同じ結果になりました。
私がこの行動を観察する理由を教えてください。