2011-09-17 19 views
6

私は月末に24x7で動作するC#ベースのWindowsサービスを作成しています。私は私のサービスの一般的なメモリ使用量を追跡できるようにしたいと思います。バイトまで正確にする必要はありません。割り当てられた総額で十分です。私はメモリ消費の傾向についてこれを監視しています。 GC.GetTotalMemory()はこれを監視する適切な方法ですか?C# - GC.GetTotalMemory()Question

私はパフォーマンスモニタとカウンタの使用について認識しています。ただし、このサービスは少なくとも12の異なるサーバーで実行されます。私は12の異なるサーバーでPMを追跡したくありません。このサービスは、すべてのインスタンスから中央のDBにすべてのパフォーマンスおよびメモリ使用情報を保持し、これを回避し、より簡単な分析を行います。

答えて

5

純粋に管理されたメモリアプリケーションの場合のみ。いずれかがアンマネージコードを呼び出すと、そこに割り当てられたメモリはガベージコレクタに登録されません(誰かがGC.AddMemoryPressureを呼び出すことを覚えていない限り)。

+0

ありがとうございました。純粋に管理されたアプリケーションです。 –

2

パフォーマンスカウンターを使用します。ファイルに記録するように設定することができます。

また、コード内のパフォーマンスカウンターを読み取って中央の場所に保存することもできます。

+0

+1 Perf Countersでは、CPUやI/O Usageなどの他の何百万ものものを監視することができ、時間の経過とともにボトルネックになる可能性があります。 –

+0

@ TheCodeKing - 通常、私は、実際に持っています。ただし、このサービスは少なくとも12の異なるサーバーで実行されます。私は実際には12の異なるサーバーでPMを追跡したくありません。私は、これを避けるために、すべてのインスタンスから中央DBにすべてのパフォーマンスとメモリ使用情報を残しています。 –

+1

リモートマシン上のパフォーマンスカウンターに接続することができます。そのため、管理を一元化し、まだ適切でないかどうかを理解することができます。もちろん、これらをコードで読むこともできます。 – TheCodeKing

3

GC.GetTotalMemoryは、割り当てられると思われるメモリの量を取得します。あなたが割り当てられた他のメモリについてそれを知らせるためにGC.AddMemoryPressureを呼び出さない限り、管理されたコンポーネントによって割り当てられたメモリについてのみ知っています。

Process.WorkingSet64Process.VirtualMemory64、およびProcessクラスの他のそのようなプロパティを読み取ることによって、割り当てられた実際のメモリ量をより正確に知ることができます。 Process.GetCurrentProcessに電話して、必要なものを手に入れてください。

つまり、パフォーマンスカウンタを使用する方がよいでしょう。

3

これはあなたの質問に対する直接的な回答ではありませんが、あなたのサービスを24時間365日も稼働させ続けるつもりです。

私はヒープフラグメンテーションをよく知っています。説明については、this articleを参照してください。

+0

ありがとうございます。その記事は役に立ちます。 –

+0

ユニティ/サイドノートで作業する人にとってはさらに重要です – Fawar