- - PR -
GCについて
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2003-04-03 20:39
こんにちわ
VB.NETで任意のタイミングでGCを発生させることは可能でしょうか。 | ||||
|
投稿日時: 2003-04-03 21:01
不可能ではありませんが、通常はそれをする必要はありません。どうしてそうしたいのでしょうか?
| ||||
|
投稿日時: 2003-04-03 21:48
レスありがとうございます。
私は計測器の制御にVBを利用しています。 測定をある程度すると(3万回以上)ソフトが停止してしまいます。運がいいとそのまま実行を続けられますが、フリーズするときもあります。 そのとき、HDDのランプが点灯しているのでGCが発生しているのではないかと思います。 原因がGCとすれば任意のタイミングでGCを発生させることが出来ればこの現象を回避できるのではと思っています。 よろしくお願いします。 | ||||
|
投稿日時: 2003-04-03 22:27
GC.Collect();
でしょうか | ||||
|
投稿日時: 2003-04-04 09:34
こんにちは。
その時、プロセスのメモリ使用量はどうなっていますか?GCを疑うより、効率の悪い作りをしていないか、調べましょう。 たとえば、こんな作り方をしていると、効率が悪いです。 for i = 0 to 1000 dim strbld as new system.text.stringbuilder() ' 処理 next strbldは、プログラムの処理がnextまで進むと参照が外れますが、参照が外れた時点では解放されません。そのため、おそらく1001個のstringbuilderが作られます。そして、forループを終わった後、一挙に1001個のstringbulderがガベージコレクトされます。しかし、 dim str as new system.text.stringbuilder() for i = 0 to 1000 ' 処理 str.length = 0 next とすると、stringbuilderは1個しかできず、ガベージコレクトされるのも1個だけです。ループ内も含め、どちらの方が負荷が軽いか、わかりますよね。 | ||||
|
投稿日時: 2003-04-04 10:27
JITTAさん、ご指摘ありがとうございます。
タスクマネージャで調べたところ、CommitChargeのTotal値が回数を重ねるごとに 少しずつふえています。 また、プログラムを見直して見ます。 | ||||
|
投稿日時: 2003-04-04 10:30
これをまず確定させましょう。GCがおきているかどうかは、パフォーマンスモニタで見ることができます。 | ||||
|
投稿日時: 2003-04-04 18:02
GC.Collectを利用しましたが現象は軽減されましたがまだ発生してます。
JITTAさんのご指摘どうりプログラムの組み方がかかわっていると思いますが なかなか見つかりません。 パフォーマンスモニタのコミットチャージを見ていると少しずつ増えています。 この現象を解消しないといけないのまでわかっているんですが。 |