ESRI独自の.NET相互運用機能アセンブリを介してESRIのArcObjectsCOMライブラリを使用する地理データを処理するための.NETアプリケーションに取り組んでいます。
本番環境で実行している場合、プロセスごとのメモリ制限が2GBに達するため、一部の操作中にプロセスがクラッシュする可能性があります。(ArcObjectsは32ビットライブラリです。)これは、一部の処理ステップで多くの一時的なArcObjectsジオメトリオブジェクトが作成される可能性があるためです。FinalReleaseComObject
および関連するヘルパーメソッドを使用してこれらのオブジェクトを手動で解放したにもかかわらず、メモリリークが発生し、最終的にメモリが不足します。ただし、をWaitForPendingFinalizers
呼び出して定期的に呼び出すことでGC.Collect
、 GCにメモリを強制的に解放させFinalReleaseComObject
、メモリ使用量を制御することができます。それ以外の場合、プロセスが終了するまで(正常または異常に)多くのオブジェクトがメモリに残ります。
最初の質問:ArcObjects COMオブジェクトによって保持されているメモリがすぐに解放されないのはなぜですか?または、GCが、リリースされたCOMオブジェクトをファイナライズして、クラッシュする前にメモリを再利用するのではなく、プロセスをクラッシュさせるのはなぜですか?
アプリケーションはWindows200864ビットで本番環境で実行されますが、私はWindows732ビットを使用して開発しています。プロセスを本番ボックスでクラッシュさせることはできますが、開発ボックスでクラッシュさせることはできません。これは、ローカルでは通常、デバッグビルドを使用してVisual Studioで実行しているためだと思いましたが、リリースビルドを使用してデバッガーなし(デバッグなしで開始)でも試しましたが、それでもそれほど多くは使用されませんでした本番環境と同じようにメモリを使用し、クラッシュしません。
2番目の質問:なぜですか?
編集:以前の実験では、GC.Collect
明示的に呼び出していたとしても、それだけでは不十分であることがわかりました。アルゴリズムを繰り返すたびにメモリ使用量を抑えてから呼び出すユーティリティメソッドがありますGC.Collect
。GC.WaitForPendingFinalizers