0

誰かが助けてくれることを願っています!

VB6 から変換されたかなり大きな VB.Net MDI アプリケーションがあります。MDIChild フォームを開かずに最初に起動すると、約 35,000K が使用されます。より多くのフォームが開かれる (ただし、閉じられない) と、(タスク マネージャーによると) メモリ使用量はフォームごとに約 4,000K まで上昇します。(TM はアプリケーションに割り当てられたメモリのみを表示し、実際に使用されたメモリは表示しないことを認識しています。)

問題は、割り当てられたメモリが特定のポイントに達すると (ターゲット マシンで使用可能なメモリの量によって異なります)、1 つまたは複数の開いているフォームが閉じられるまで、フォームを開くことができなくなることです。開くことができるフォームの量の「制限」は、マシンの使用可能なメモリに依存するようです。

例: - マシン全体で 512M しかない仮想マシンでは、約 7 ~ 8 フォームのように見え、割り当てられたメモリは約 80,000K になります。- 3GB のターミナル サーバー マシンで、他のさまざまな負荷の高いアプリケーションも実行していますが、約 20 以上のフォームと約 100,000 ~ 105,000K のメモリ割り当てで停止します。

perfmon を使用して、リークがあるかどうかを確認してみました。これは、安定した使用を示しています。

ただし、フォームを閉じても、割り当てられたメモリは、閉じられた最初のフォームでは約 3000K だけ減少し、その後閉じられたフォームごとに 100K しか減少しません。その後、さらにいくつかのフォームを追加するとメモリが増加し、いくつかを閉じると、同じ -3000K、-100K のメモリ削減パターンが再び発生します。

これまでにこれに遭遇した人はいますか?これは少しショーストッパーのように見えるので、誰か助けてください!返信をお待ちしております。

ちなみに、元のVB6バージョンにはこの問題はなく、各フォームを閉じると、アプリが割り当てられたよりも少ない量をリリースするため、メモリ割り当てが徐々に増加するのではなく、最初のメモリ割り当てに戻ります。

編集:開発中に同じエラーが発生しました。UserControl で WIN32Exception がスローされているようです。エラーは「ウィンドウ ハンドルの作成中にエラーが発生しました」です。

ありがとう、よろしく、デュアン。

4

2 に答える 2

0

USER オブジェクトを解放する前に、カスタム UserControls 内の個々のコントロールを明示的に Dispose する必要があることがわかりました。

于 2010-07-12T16:36:49.607 に答える
0

アプリは、Windows が課すハンドルのクォータを消費しているだけです。デフォルトでは 10,000 ハンドルです。別のウィンドウを作成しようとすると、「ウィンドウ ハンドルの作成中にエラーが発生しました」というメッセージが表示されて失敗します。

VM または TS のインストールでは、これらの制限が低くなる可能性がありますが、確かではありません。上限はかなり大きく、遠く離れていても問題はありません。タスク マネージャーで、[表示] + [列の選択] を使用し、USER オブジェクト、GDI オブジェクト、およびハンドルにチェックマークを付けます。これらの列のいずれかが際限なく増加していることは、フォームやコントロールを破棄しないなど、コードにバグがあることを示しています。より多くのメモリを消費することは、このリークの副作用です。

于 2010-07-08T14:11:05.637 に答える