- PR -

GCについて

投稿者投稿内容
おじか
ベテラン
会議室デビュー日: 2002/12/04
投稿数: 57
お住まい・勤務地: 埼玉県
投稿日時: 2003-04-03 20:39
こんにちわ
VB.NETで任意のタイミングでGCを発生させることは可能でしょうか。
NothingButXMLInfoSet
ベテラン
会議室デビュー日: 2003/03/31
投稿数: 65
投稿日時: 2003-04-03 21:01
不可能ではありませんが、通常はそれをする必要はありません。どうしてそうしたいのでしょうか?
おじか
ベテラン
会議室デビュー日: 2002/12/04
投稿数: 57
お住まい・勤務地: 埼玉県
投稿日時: 2003-04-03 21:48
レスありがとうございます。
私は計測器の制御にVBを利用しています。
測定をある程度すると(3万回以上)ソフトが停止してしまいます。運がいいとそのまま実行を続けられますが、フリーズするときもあります。
そのとき、HDDのランプが点灯しているのでGCが発生しているのではないかと思います。
原因がGCとすれば任意のタイミングでGCを発生させることが出来ればこの現象を回避できるのではと思っています。
よろしくお願いします。
Tog
ベテラン
会議室デビュー日: 2002/06/09
投稿数: 76
投稿日時: 2003-04-03 22:27
GC.Collect();
でしょうか
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-04-04 09:34
こんにちは。
引用:

おじかさんの書き込み (2003-04-03 21:48) より:
測定をある程度すると(3万回以上)ソフトが停止してしまいます。運がいいとそのまま実行を続けられますが、フリーズするときもあります。
そのとき、HDDのランプが点灯しているのでGCが発生しているのではないかと思います。


 その時、プロセスのメモリ使用量はどうなっていますか?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個だけです。ループ内も含め、どちらの方が負荷が軽いか、わかりますよね。
おじか
ベテラン
会議室デビュー日: 2002/12/04
投稿数: 57
お住まい・勤務地: 埼玉県
投稿日時: 2003-04-04 10:27
JITTAさん、ご指摘ありがとうございます。
タスクマネージャで調べたところ、CommitChargeのTotal値が回数を重ねるごとに
少しずつふえています。

また、プログラムを見直して見ます。
NothingButXMLInfoSet
ベテラン
会議室デビュー日: 2003/03/31
投稿数: 65
投稿日時: 2003-04-04 10:30
引用:

おじかさんの書き込み (2003-04-03 21:48) より:
原因がGCとすれば



これをまず確定させましょう。GCがおきているかどうかは、パフォーマンスモニタで見ることができます。
おじか
ベテラン
会議室デビュー日: 2002/12/04
投稿数: 57
お住まい・勤務地: 埼玉県
投稿日時: 2003-04-04 18:02
GC.Collectを利用しましたが現象は軽減されましたがまだ発生してます。
JITTAさんのご指摘どうりプログラムの組み方がかかわっていると思いますが
なかなか見つかりません。
パフォーマンスモニタのコミットチャージを見ていると少しずつ増えています。
この現象を解消しないといけないのまでわかっているんですが。

スキルアップ/キャリアアップ(JOB@IT)