ArcObject 開発におけるメモリ リークの問題を思い出してください

デスクトップ GIS 処理ソフトウェアの開発過程で、プログラム クラッシュの問題に遭遇しました。問題も非常に単純で、少量のデータをエクスポートするときはプログラム クラッシュが発生しませんでしたが、大量のデータを処理する過程でプログラム クラッシュが発生しました。 、プログラムのクラッシュが発生しました 質問; これで当然メモリ リークの問題が思い浮かびましたが、私は C# でのデスクトップ開発をあまりしないため、メモリ リークの変数をどのように見つけるかが問題になりました。

1. ツールを探す

まず、プログラムがクラッシュして例外がスローされるまでデバッグ モードでプログラムを実行すると、それが OutOfMemory の問題であることがわかります。例外をスローするプログラムはループ内にあり、これによってメモリ リークの問題も確認されます。次のステップは、使用中に解放されなかったオブジェクトが何であるかを確認することです。コードは他の人が書いたもので、長時間読んでもそれがどの変数であるかわかりませんでした (このステップはコーディング経験のテスト、または私の経験不足かもしれませんが、要するに問題は見つかりませんでした)。
次に、ツールを検討しました。私はどのツールも使用した経験がありません。Baidu で検索したところ、Visual Leak Detector と Visual Studio に付属の診断ツールの 2 つの解決策が見つかりました。前者は非常に素晴らしそうです。ブログの紹介文を読みました。メモリ リークの行を直接特定するのは問題ないと思いますが、他の人のコードは C 言語であることがわかります。私たちは C# です。それはわかりません。忘れてください。診断ツールを見てみましょう。 VSが付属しています。

2. 学習ツール

このブログはここから読むことができます: VS メモリ リークの 3 つの検出方法
1. デバッグ - 「ウィンドウ」診断ツールを表示
ここに画像の説明を挿入
2. デバッグする場所でポイントをブレークし、診断ウィンドウでメモリ使用量を選択します
ここに画像の説明を挿入
3. 最初のページに移動ブレークポイント 4.
ここに画像の説明を挿入
ここに画像の説明を挿入
ブレークポイント デバッグの次の文を実行し、クリックしてスナップショットをキャプチャします。メモリ使用量が増加すると、メモリ使用量が変化します。
ここに画像の説明を挿入

3. 位置決めの問題

2 番目のセクションでは、診断ツール 3 と 4 を使用して複数回テストし、メモリ リークのデータ構造を見つけます。ここでは、単一のデータが比較的小さいため、違いが見られない可能性があります。エンドポイントは 10,000 サイクルごとに中断されるため、メモリ リーク ポイントを簡単に通知できます。
ここに画像の説明を挿入
ここで、ComReleaser オブジェクトにメモリ リークがあることがわかります。
それでソースコードを見てください

comReleaser.ManageLifetime(featureBuffer);

featureBuffer 変数はループ内で作成され、上記のステートメントが作成されるたびに comreleaser に追加され、メモリを解放するコードがループの外にあるため、ループ中にメモリ爆発が発生します。

4.解決する

ここでは、上記のコードをコメントアウトし、手動でメモリを管理する代わりに、メモリの回復を C# の GC に戻します。テストの結果、メモリ リークの問題は解決されていることがわかります。ビンゴ!

おすすめ

転載: blog.csdn.net/zhoulizhu/article/details/129878397