- - PR -
vb.netのプログラムでメモリ使用量が膨大になるとプログラムが固まる
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-08-04 17:01
エントリープログラムなのですが4フォームあり、
総コントロール数1000弱(内ひとつのフォームで800強) というプログラムがあります。 このプログラムで数十回エントリーを行うと プログラムが固まるという現象が起きています。 固まった時、タスクマネージャのプロセスで見てみると メモリ使用量が90MBを越えている状態です。 インスタンスの開放、GC.COLLECT等行いメモリの 開放は積極的に行っているのですが、じわじわと メモリが増えて行きます。起動時のメモリ使用量は70MB弱です。 またデバッグで見てみると親フォームの ソースの一番上(Public Class Form1のところ)で緑の三角矢印 が表示される状態でどこが原因かもつかめません。 同じようなエントリープログラムがあるのですがこの現象は発生しません。 違いは標準モジュールを使い構造体を何百と宣言している ぐらいなのですが、標準モジュールがメモリに溜まるという 現象がvb.netでは起こりえるのでしょうか。 ご存知の方がいらっしゃいましたらご教授ください。 よろしくお願い致します。 |
|
投稿日時: 2004-08-04 17:22
Form1からForm2に移動するときにForm2の新しいインスタンスを生成。
Form2からForm1に戻るときにForm1の新しいインスタンスを生成。(以前のForm1のインスタンスは、表示はされていないがメモリ上には残ったまま) Form1からForm2に移動するときにまたForm2の新しい・・・(以下略) なんてことはないですか? |
|
投稿日時: 2004-08-04 17:55
ご返信ありがとうございます。
>Form1からForm2に移動するときにForm2の新しいインスタンスを生成。 >Form2からForm1に戻るときにForm1の新しいインスタンスを生成。 >(以前のForm1のインスタンスは、表示はされていないがメモリ上には残ったまま) >Form1からForm2に移動するときにまたForm2の新しい・・・(以下略) form1からform2を呼ぶ際は以下のようにコーディングしています。 Dim frm As Form2 frm = New Form2 frm.ShowDialog() frm.Dispose() frm = Nothing ダイアログなのでform2からform1を呼び出すような コーディングにはなっていません。 以上よろしくお願い致します。 |
|
投稿日時: 2004-08-05 13:31
ひとつ新たにわかった事がありましたので追記します。
メモリ使用量が増えた時に固まると思っていましたが、 あまり関係ないようでした。 例えば最小化してタスクバーに入れるとメモリ使用量が 激減します。が、前述の通り数十回データの入力を行うと 固まります。 但し、CPU使用率がわずかではありますが入力途中に 少しずつあがっていくことがわかりました。 積み重なり25%ほどになると固まるようです。 この際このプログラム以外は特に動かしていません。 OSはWindowsServer2003です。 CPU使用率が上がりそうなポイントなどご存知の方が いらっしゃいましたらよろしくお願い致します。 |
|
投稿日時: 2004-08-05 14:29
こんにちは。
UIを持つアプリケーションは、手を休めている間はアイドル状態となり、その間は基本的にCPUは殆ど使わないので(別スレッド等で処理が走っていなければ)、今回のように積みあがっていくというのはおかしな状況だと思います。 入力処理周辺でメッセージループを阻害するような、ループ処理が発生していたりしないでしょうか?Windowsメッセージが処理できない状態になると、画面が固まったようになります。 |
|
投稿日時: 2004-08-05 15:22
入力値検証をやっているあたりが怪しそうですね。
入力用のフォームに多数のコントロールがあるようですが、現在の随時作成では、パフォーマンスなどの面で、あまり良さそうではありませんね。show/hideを制御して、インスタンスはいつもある、というようにはできないのでしょうか。 |
|
投稿日時: 2004-08-05 17:56
みなさん色々とアドバイスありがとうございます。
とりあえず教えて頂いた事をヒントにプログラム改造に 取り組んでみます。 また結果報告いたします。 |
|
投稿日時: 2004-08-06 14:13
ついに問題解決しました。
原因はサードパーティー製のコントロールでした。 GRAPECITY社のINPUTMAN.NET2.0のバグで 「大量のコントロールを使用するとCPU使用率が上がる」 というものでした。 7月29日にパッチが出たばかりで、それを適用すると とりあえず現象は再現しなくなりました。 後は数日様子を見ようと思います。 どうもありがとう御座いました。 |