1

この例を見てみましょう。これで私のすべての質問がカバーされると思います。

class SomeClass
{
    static SomeType PropertyA
    {
        get
        {
            if (....)
                return MethodA();
            else
                return MethodB();
        }
    }

    static SomeType MethodA() { ... }
    static SomeType MethodB() { ... }
}

SomeClass.PropertyA プロパティを呼び出すとメモリ リークが発生しますか? プロパティ自体にはバッキングフィールドがなく、メモリリークが発生するため、私の意見はノーです。静的プロパティがメモリリークを引き起こす可能性があることを読んだので、これを尋ねますが、インスタンスへの参照を保持しているため、メモリリークの原因はバッキングフィールドだと思います。

したがって、上記の例では、上記の例の MethodA、MethodB、および PropertyA によってメモリ リークが発生することはありません。私はこれについて間違っていますか?

私が持っている別の質問は次のとおりです。ほとんどの場合、状態もデータも持たないクラスがたくさんあります。彼らは単に代理として行動しています。これらのメソッドのいくつかは、非常に頻繁に呼び出されます。私の質問は、これらのクラスをシングルトン、静的、または通常のクラスにする必要がありますか?

完璧な例は、5 ~ 10 個のメソッドを含み、いくつかの SQL クエリを実行するクラスです。

1)それらを通常どおりに持っている場合、(ユーザーの反応で)非常に頻繁にそれらを作成し、何らかのメソッドを呼び出してから、ガベージコレクションを許可する必要があります。

2)シングルトンと静的のどちらを選択するか、長所/短所は何ですか?

3) プロキシ メソッドを含むクラスがあり、それぞれに 10 個のパラメーターを含む 2 ~ 3 個の IDbCommands があり、それらを再利用することが有益である場合、正しいパターンを選択する際に何かが変わるでしょうか?

編集:おそらく誤解が原因で、私をさらに混乱させるいくつかの回答を得たので、最初の質問への回答を投稿します。PropertyA(およびMethodA)を介して取得される大きなバイト配列(300MB)を割り当てたテストを行いました。上記の例の PropertyA と MethodA はどちらも、このオブジェクトをフェッチした後は参照を保持しないため、コードの呼び出しが配列で完了するとすぐに、GC によって処理されます。そのため、ゲッターのみで静的プロパティを使用する場合、または静的メソッドを使用する場合、メモリ リークは発生しません。

4

2 に答える 2

1

したがって、上記の例では、上記の例の MethodA、MethodB、および PropertyA によってメモリ リークが発生することはありません。私はこれについて間違っていますか?

それらがメモリを作成または保持しないことを意味する場合、それは本当です-プロパティ自体はメモリを保持しません.

静的フィールドは「メモリ リーク」を引き起こしません。クラスを最初に使用する前に型の型初期化子が実行され、フィールドにメモリが必要な場合は、そのフィールドのメモリが割り当てられます。このメモリはクリアされません-それが「リーク」の意味であれば-しかし、解放するインスタンスがないため、これは予期された望ましい動作です。

于 2012-08-25T01:23:24.820 に答える
0

簡単な答えは、「メソッドは何をするのか、状態を保持するのか、単純なガベージ コレクション以上のクリーンアップが必要なのか、それとも必要としないのか?」という質問です。

上記のすべてに当てはまらない場合、リークがないのは当然です。リークが発生するのは、何も対策を講じていない場合のみであり、何のアクションも必要としない場合は、リークは発生していません。

最近では、リークよりも「メモリ プレッシャ」が問題になっています。

一般に、ガベージ コレクションを提供し、モックとテストのシナリオをより簡単に行えるようにするため、インスタンス アプローチを好みます。

静的メソッドと変数は、インスタンス変数とメソッドと同じ問題の影響を受けるため、可能であれば両方にリークが適用されます。

于 2012-08-25T01:30:10.997 に答える