1

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について、複数のしきい値を試しましたが、同じ結果になりました。

私がこの行動を観察する理由を教えてください。

4

0 に答える 0