3

私はC#、フレームワーク4のアプリケーションを持っています。非常に基本的に、このアプリケーションは主にイベントに反応してオブジェクトを作成し、それらを解放し、データベース接続を作成して閉じます。

今、私たちはアプリケーションのプロセスが時々非常に奇妙な方法で成長するのを見てきました。2つの異なる動作があります:

  1. アプリケーションは、RAMが最大4 GBに達するまで成長しますが、通常は約500MBにとどまる必要があります。結果->クラッシュします!
  2. アプリケーションは1200MB(30分)までゆっくりと成長し、その後500 MB(1秒)まで急激に縮小します...そしてこのプロセスは時々繰り返されます。これは実際のガベージコレクターになることができますか?

ここで、アプリケーションに関する詳細情報を提供するために、ログファイルにアプリケーションのプロセスのサイズを追加したいと思います。ネイティブフレームワークを介して可能ですか?C#でオブジェクトのサイズを知ることは可能ですか?

NetMemoryProfiler4アプリケーションも見つけましたが、可能であれば埋め込みロギングを使用したいと思います。

4

2 に答える 2

4

このような問題をデバッグするには、メモリ プロファイラーが必要です。例えば:

また、メモリ リークに関する他の質問からの提案も参照してください。

基本的に、これは、メモリ内に留まるべきではないのに留まるオブジェクトを見つけることに要約されます。クラスへの参照を保持するイベント ハンドラーや、親への参照を保持するオブジェクトのコレクションなどです。根本原因を見つけた後、不要な参照を取り除くためにアプリケーションを再構築する必要がある場合があります。これは、忘れられたイベントのサブスクリプション解除を追加するのと同じくらい簡単ですが、重要なケースでは、いくつかの構造設計パターンを適用する必要がある場合があります。この部分は非常にアプリケーション固有です。

于 2012-09-18T10:29:01.457 に答える
0

たぶんProcess、クラスはあなたが探している正しいものです。現在のプロセスを取得するために
使用します。次に、などのプロパティ を使用できます。Process myProcess = Process.GetCurrentProcess()
myProcessWorkingSet64PrivateMemorySize64

于 2012-09-18T10:12:30.487 に答える