8

私の同僚は、Oracleのodp.netado.net実装にメモリリークがあると確信しています。彼はこの理論をテストするためのテストプログラムを作成し、解放されているメモリの量を判断するために、各オブジェクトでdisposeを呼び出した後に次のことを行っています。

PerformanceCounter p = new PerformanceCounter("Memory", "Available Bytes");

GC.Collect();
GC.WaitForPendingFinalizers();

float mem = p.NextValue();

結果のパフォーマンス値は、オブジェクトを破棄する前に取得された値と比較されます。これにより正確な結果が得られますか?

4

1 に答える 1

2

これを行う最良の方法はを使用することだと思いますGC.GetTotalMemory(true)。オブジェクトを割り当てる前にこれを呼び出して、その時点で割り当てられたメモリの量を記録できます。次に、オブジェクトを作成し、オブジェクトに対して何らかの操作を実行して破棄し、オブジェクトへの参照がないことを確認して(おそらく、ローカル変数をに設定するだけですnull)、再度呼び出します。

ドキュメントによると、戻り値が完全に正確ではない可能性があることに注意してください。メソッドは次を返します。

管理対象メモリに現在割り当てられているバイト数の利用可能な最良の概算である数値。

その後、2つの値を比較できます。これを繰り返し行うと、オブジェクトが実際に管理対象メモリをリークしているかどうかを確認できます。

もちろん、オブジェクトがアンマネージメモリをリークした場合、これは役に立ちません。

もう1つのオプションは、メモリプロファイラーを使用することですが、メモリがどこでリークする可能性があるかを正確に知っている場合、それはやり過ぎかもしれません。

于 2012-05-02T03:00:32.343 に答える