私は、Win 2k8 (.NET 4.5) 上の 64 ビット IIS で実行されている C# で大量の Web サービスを作成しています。この Web サービスは、XML ペイロードで動作し、小規模および大規模なオブジェクト (大規模なオブジェクトが主に存在する場所) に対してさまざまな操作を実行します。文字列、85k を超えるものもあります (LOH に進みます))。リクエストはステートレスであり、メモリ使用量は時間の経過とともに安定しています。リクエストごとに大量のメモリが割り当てられ、解放されていますが、メモリがリークしているようには見えません。
2 つのプロファイリング ツールによると、1 秒あたり最大 25 のトランザクションで動作し、平均呼び出しは 5 秒間持続し、時間の 40 ~ 60% を GC で費やしています。perfmon は、5 秒間で 20 の G0 および G1 コレクションを安定して示しています。 5 秒以上の G2 コレクション - G0 にとどまると予想されるデータの G2 への多くの (私たちが考える) 時期尚早のプロモーションを意味します。私が読んだすべては、これが非常に過度であることを示しています。システムは 25 tps よりも高いスループットで実行できるはずであり、GC アクティビティがこれを妨げていると想定しています。
リクエストを処理するマシンには大量のメモリ (16 GB) があり、負荷がかかっているアプリケーションは、負荷が 1 時間かかっても最大で 1 GB しか消費しません。ヒープを大きくしても必ずしも状況が改善されるわけではないことは理解していますが、予備のメモリがあります。
これが詳細に欠けていることを感謝します(時間が許せば、簡単なアプリケーションで条件を再現しようとします)-しかし、G2 GCアクティビティがこれほど多く見られる理由を誰か説明できますか? LOHに集中する必要がありますか?CLR の GC は負荷に「適応する」とよく言われますが、この場合の動作は変わらず、他のランタイムとは異なり、調整するためにできることはほとんどないようです (ワークステーション GC を試しましたが、目に見える違いはほとんどありません)。