tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルパフォーマンス劣化
記事No824
投稿日: 2004/04/22(Thu) 14:51
投稿者にきゅ〜
[OSのVer]:Windows2000    [VBのVer]:VB.NET2003 
Windows CE.NETを使用しています
主にPDAでファイルの読み書きを行っています。
主にPDA上のフォルダにファイル作って
その作ったファイルに値を書き込む・もしくはファイルに書き込まれている内容を読む。
という処理だけです。読込むファイルは全て80File.書き込むファイルは10File)
(ファイルを読んで該当のデータが存在していたらglobal構造体に値をセットしています.
仮に100行データが存在していたら一度100行全て読んでいます。)
一回処理が始まって終了する時は必ず、使用した変数を初期化しています。
しかし、何回か使っていると画面が開くのがえらく遅くなって、
結局PDA上でメモリエラーが表示されて
アプリが途中で終了する場合もあります。
PDAのメモリは32MBです。

そこで質問なのですが、動作中のメモリが極端に少なくなってきたら、
メモリの解放の命令文を記述して、メモリ解放しなくてはいけないのでしょうか。
.NETではそういうたぐいのは考えなくても.NETでは行ってくれると聞いていたので
(間違っていたら申し訳ありません。)

[ツリー表示へ]
タイトルRe: パフォーマンス劣化
記事No830
投稿日: 2004/04/29(Thu) 13:22
投稿者NAO★
メモリが不要になってから、実際に開放されるまでには
タイムラグがあるそうなので、急に大量のメモリが必要となるときには
GC.Collect メソッドを使用して強制開放したほうが良いようです。

「ガベージコレクションの強制実行」
hhttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconforcingcollection.asp

[ツリー表示へ]
タイトルRe^2: パフォーマンス劣化
記事No905
投稿日: 2004/06/10(Thu) 04:03
投稿者たくボン
補足です。

ガベージコレクタは、ヒープが満杯(ジェネレーションが0になる場合)になると起動しますが、VBでい
うグローバル変数,Static変数,ヒープ上の強い参照,CPUレジスタなどは不要なメモリを検索する際のル
ートとなるので、回収の対象になりません。CEでの開発経験はないのですが、極端にメモリが制限され
ている状況ならば、
・変数の配置位置を考える
・関数を細分化して、個々の関数内で完結するコードを書く(同一メソッド内で複数のIOを行わない。
もしくは明示的にファイナライゼーションを行う等々)
が効果的かもしれません。分割が不可能ならばC#などのusingステートメントを利用する方法もありま
す。

おそらく複数のファイルをIOするので、ヒープが満杯になる状況が連続して発生しているのだと思いま
す。ガベージ対象のルートとなる上記のオブジェクトを検討してみることでいくらか効果が期待できる
と思います。

特にFinalizeを実装しているクラスでは、そのオブジェクトが参照している他のオブジェクトも延命さ
れてしまうので注意が必要です。このような場合は、長い処理を行う関数内であるのならDisposeメソッ
ドを使用して不要になった変数は明示的にDisposeしてあげることが重要です。

このあたりのガベージコレクタの挙動は、「プログラミング .NET Framework(ISBN4-89100-303-0)」等
の書籍でわかりやすく説明されているので一度目を通してみるのも良いかと思います。

[ツリー表示へ]