2

複数のスレッドによって頻繁に呼び出される静的メソッドを含むユーティリティ クラスを開発しています。時間の経過とともにメモリ使用量が増加していることに気付いているため、メモリ リークが発生しているように思えます。

これらの静的メソッドに使用しているパターンの簡単な例を次に示します。

public static int CreateNewThing(int IDofSomeDBObjectHoldingInfoToCreateNewThing)
{
    using(SomeDBContext context = new SomeDBContext(connectionString))
    {
        SomeDBObjectHoldingInfoToCreateNewThing createNewThingyInfo = context.SomeDBObjectsHoldingInfoToCreateNewThing.First(obj => obj.ID == IDofSomeDBObjectHoldingInfoToCreateNewThing);
        // Do some stuff to create the new object
        // Return the ID of the newly created thingy...
        return theNewThingThatWasCreated.ID;
     }
}

私の質問は、「using」ステートメントを使用するか、静的メソッド内で Dispose を直接呼び出すと、実際にメモリがクリアされるかどうかです。確かに、このアプリケーションの全体的なアーキテクチャや目的については述べていませんが、ここで最適なパターンを使用しているかどうかも疑問に思っています。.NET でスレッド セーフなユーティリティ クラスを作成するためのベスト プラクティスは何ですか?

4

2 に答える 2

6

時間の経過とともにメモリ使用量が増加していることに気付いているため、メモリ リークが発生しているように思えます。

必ずしもそうではありません - それについて本当に良いアイデアを得るには、より多くのデータを提供する必要があります.

私の質問は、「using」ステートメントを使用するか、静的メソッド内で Dispose を直接呼び出すと、実際にメモリがクリアされるかどうかです。

usingステートメントはメモリのクリーンアップに関するものではありません。それがGCの仕事です。それらは、メモリ以外のリソースを解放することです。静的メソッドにいるかどうかは、SomeDBContext破棄する必要があるかどうかとはまったく関係ありません。

于 2012-10-17T15:33:05.890 に答える
6

私の質問は、「using」ステートメントを使用するか、静的メソッド内で Dispose を直接呼び出すと、実際にメモリがクリアされるかどうかです。

usingは構文的に単純な呼び出し方法ですDispose

using(MyClass obj = new MyClass())
{

}

は次のように書くのと同じです:

MyClass obj;
try
{
    obj = new MyClass()
}
finally
{
    ((IDisposable)obj).Dispose();
}

次に、Disposeメモリを解放します。いいえ、そうではありません。Dispose は、クリーンアップされないアンマネージ リソースを解放するように設計されており、ガベージ コレクターはこのオブジェクトのメモリを解放します。実際には、オブジェクトのメモリをすぐに解放するわけではありません。破棄する必要がある一般的なものは、ネットワーク接続 (ここでのケースのように) ファイル ハンドル、別の言語との相互運用によって作成されたアンマネージ メモリなどです。

それで、なぜあなたの記憶は上がっていますか?要するに、それは単なる通常の動作です。オブジェクトを作成していて、それらがメモリを使用しているため、メモリが増加しています。ある時点で、ガベージ コレクターは、メモリを解放するためにコレクションを実行する必要があると判断します。(おそらく、システムが不足していて、さらに必要なため、または C# 言語が指定したその他の条件が原因である可能性があります。コレクションが本当に必要な場合は、ほとんどの場合、あなたよりもよく知っています。)

したがって、実際の問題が発生するまでは心配する必要はありません。これはマネージ言語の通常の動作です。メモリが不足し始めた場合、またはコレクション発生してもメモリが下がらない場合は、問題を探し始める必要があります。

于 2012-10-17T15:36:08.607 に答える