1

C# を使用して WPF でアプリケーションを開発しました。アプリケーションには、特定のウィンドウにカメラを表示するためのサードパーティの dll が含まれています。

通常、アプリケーションは、カメラ オブジェクト (管理対象外オブジェクト) なしで 90 MB ~ 135 MB のメモリを使用します。つまり、デザインとコード ページ (xaml と xaml.cs) でカメラ オブジェクトに関するすべてのコードを削除しました。メモリが増加し、1 つの最大値で停止します。

アプリケーションでカメラ オブジェクトを使用すると、メモリが徐々に増加しています。毎回カメラウィンドウを開くと、メモリが135MB→141MB→143MB…と徐々に増えていきます。

管理されたメモリをクリアするために必要なすべての場所にGC.CollectUsingステートメントを使用しました。メモリの増加を減らすことも、停止することもできません。

この問題を解決するには?

任意の提案をいただければ幸いです

前もって感謝します。

4

3 に答える 3

2

GC.Collect通常、を使用してもメモリ フットプリントは減少しません。それを呼び出すのをやめると、改善が見られるかもしれません。

より一般的な注意として、.NET アプリケーションの認識されるフットプリントについてはあまり心配する必要はありません (特に、タスク マネージャーを使用して監視している場合)。.NET ランタイムは、必要に応じてメモリを解放します。たとえば、負荷がかかっているときやアイドル状態のときなどです。したがって、表示されている値は、より多くのメモリを使用していることを必ずしも示しているわけではありません。これは、当分の間予約されているメモリです。

これを実証できる 1 つの小さなテスト: .NET アプリを最小化するとどうなるか? タスク マネージャーのメモリ使用量が劇的に減少し、ウィンドウを再表示してもすぐには回復しないことがよくあります。

于 2011-10-10T07:30:53.250 に答える
1

管理されていないカメラコンポーネントにはC#ラッパーがありますか?もしそうなら、それはIDisposableを実装していますか?カメラオブジェクト(ラップされている場合)を確実に破棄すると、アンマネージコードでデストラクタが呼び出されます

アンマネージコードはDLLインポートを介してC#コードに接続されていますか?その場合は、すべての「Close()」タイプのメソッドを呼び出してC#のメモリを解放していることを確認してください。これをきちんとパッケージ化するために、IDisposableを実装する独自の.NETクラスでカメラコンポーネントをラップすることをお勧めします

.NETイベントを購読していて、購読を解除していませんか?Camera.ImageReceived + = new EventHandler ...など。.NETイベントへのサブスクリプションを開いたままにしておくと、GCがオブジェクトへの参照がある間(イベントサブスクリプションを介して)オブジェクトを収集できないため、微妙なメモリリークが発生する可能性があります。

最後に、メモリリークをチェックするための大まかなテストは、カメラウィンドウの複数の作成/削除操作を使用してアプリを一晩実行したままにすることです。翌日にOutOfMemoryExceptionが発生するかどうかを確認します。以前のポスターが述べたように、タスクマネージャーは.NETアプリのメモリ使用量を正確に報告しませんが、酸テストは、GCが最終的にメモリを解放するのか、それとも無期限に増加し続けるのかということです。

于 2011-10-10T09:55:14.827 に答える
1

あなた自身の質問に答えたようです:

アプリケーションでカメラ オブジェクトを使用すると、メモリが徐々に増加しています。毎回カメラウィンドウを開くと、メモリが135MB→141MB→143MB…と徐々に増えていきます。

管理されたメモリをクリアするために必要なすべての場所に GC.Collect と Using ステートメントを使用しました。メモリの増加を減らすことも、停止することもできません。

前述のように、GC.Collect は管理対象オブジェクトに対してのみガベージ コレクションを実行し、非管理対象オブジェクトに対しては実行しません。メモリ リークは、マネージ コードからではなく、使用したカメラ オブジェクトから発生していると思います。それでは、なぜわざわざ GC.Collect のせいでメモリの増加を非難するのでしょうか?

これが、私がカメラ オブジェクトのせいだと思った理由です。

通常、アプリケーションは、カメラ オブジェクト (管理対象外オブジェクト) なしで 90 MB ~ 135 MB のメモリを使用します。つまり、デザインとコード ページ (xaml と xaml.cs) でカメラ オブジェクトに関するすべてのコードを削除しました。メモリが増加し、1 つの最大値で停止します。

アプリケーションでカメラ オブジェクトを使用すると、メモリが徐々に増加しています。毎回カメラウィンドウを開くと、メモリが135MB→141MB→143MB…と徐々に増えていきます。

次に、使用したカメラ コントロールを調査する必要があります。明らかに、犯人はカメラ制御です。

于 2011-10-10T09:35:56.603 に答える