4

ANTS Memory Profiler 7.0 でメモリ使用量をプロファイリングしていますが、1,000 万件程度のレコードからいくつかの DTO を設定するだけのコンソール アプリケーションの場合、アンマネージ メモリ使用量が ~193MB (~62%) であることに気付きました。

アンマネージ メモリのヘルプ テキストには次のように書かれています。

メモリは、純粋な .NET コードとして実行されていないアプリケーションの部分に割り当てられます。これには、共通言語ランタイム自体、グラフィックス バッファー、および P/Invoke または COM+ を介してアクセスされるアンマネージ データが含まれます。

なぜこの数値がこれほど高いのでしょうか?

4

1 に答える 1

6

データベースにアクセスするときは、アンマネージ コードを使用することは避けられません。エンジンへのインターフェイスは常に、.NET よりも前から存在し、相互運用性を提供するマネージド クラスによってラップされているコードです。たとえば、SQL Server と、OleDb または ODBC にピギーバックするすべてのプロバイダーに当てはまります。

これらのマネージド クラスは常に IDisposable を実装するため、ネイティブ プロバイダーによって消費されるリソースを早期に解放できます。そうするのを忘れることは非常に一般的であり、めったに気付かれません。プロセスが「重く」実行されていることを確認する以外に、多くのハンドルと管理されていないメモリを正当な理由で消費しているように見えます。これは特に、ガベージ コレクターが十分な頻度で実行されない場合に当てはまります。これは、Perfmon.exe で確認できます。したがって、Dispose を使用しないだけでなく、問題の一部は、これらの DTO オブジェクトで十分な作業を行っていないため、十分な GC チャーンを取得できないことにある可能性があります。

コードを見直して、必要に応じて Dispose() とusingステートメントを使用していることを確認してください。

于 2012-09-03T14:38:29.670 に答える