2

サービスのメモリ使用量を確認していますが、プライベートバイトが時間とともに増加していることがわかりました。サービスは必要な新しいコンポーネントを作成し、サービスが停止したときにのみ廃棄されます。そこで、サービスコールがあるときに新しいコンポーネントを作成するコードを探し、不要なときにそれらを破棄しようとしています。PerfMonを使用してプライベートバイトをチェックしています。

それで、私は今まで正しい軌道に乗っていますか?

さらに、メソッドの1つが毎回新しい構造体を作成し、それが破棄されたりnullに割り当てられたりしないことを発見しました。

var structInfo = new MyStruct();
structInfo .StructSize = Marshal.SizeOf(structInfo);
MyClass info = this.BuildStructInfo(structInfo);
return info;

編集:

このメソッドは、構造体から値を取得するクラスを返します。

廃棄する必要がありstructInfoますか?何もしなければGCで収集されますか?

4

3 に答える 3

3

構造体は値型です(たとえば、intなど)。スコープ外になると、自動的にGCされます。

メモリ使用量が増え続け、メモリリークがまったく発生しない場合があります。使用可能なメモリが十分にある場合、GCはそれほど頻繁には実行されません。

一部のオブジェクトが存続している理由を示すことができるメモリプロファイラーを使用することをお勧めします。YourKitfor.NETプロファイラーをお勧めします。これには30日間の無料トライアルがあります。

  • YourKitからアプリケーションを開始します
  • メモリスナップショットを作成します
  • リークしていると思われるクラスを検索/閲覧する
  • GCルートからパスを選択します
于 2012-08-06T13:00:36.920 に答える
3

あなたのコードに見られるのは、info構造体が呼び出し元に返されることです。したがって、質問の読者の観点から言えば、誰がどのようにそれを使用するかは神のみぞ知るということです。

内部に割り当てられた管理されていないリソースがあり、明示的にそれらを取り除きたいDispose(..)場合は、構造体を呼び出します。

一方、そのメモリの場所が不要になった場合は、それにinfoa を割り当てるだけで、次の旅行で収集できる可能性があります。nullGC

于 2012-08-06T12:38:38.187 に答える
1

サービスは必要な新しいコンポーネントを作成し、サービスが停止したときにのみ破棄されます

そのため、サービスは何らかの形でこれらのコンポーネントを保持している必要があります。意図的なもの (キャッシングなど) によるものか、偶然によるものかは、あなただけが知ることができます。

structInfo を破棄する必要がありますか? 何もしなければ GC で収集されますか?

値型の場合structInfo、スタックにのみ割り当てられ、スニペットで非常に小さいと思われる範囲外になった場合に削除されます。ここでは GC は関与しません。structInfo実装のタイプIDisposable(*) またはその他の種類の破棄メカニズムはありますか? その場合は、Dispose明示的に呼び出します。

(*) いくつかの特別なシナリオは別として、これは非常に危険なビジネスであり、自分が何をしているのかをよく知る必要があります。

于 2012-08-06T14:04:20.663 に答える