タイトル | : Re^2: パフォーマンス劣化 |
記事No | : 905 |
投稿日 | : 2004/06/10(Thu) 04:03 |
投稿者 | : たくボン |
補足です。
ガベージコレクタは、ヒープが満杯(ジェネレーションが0になる場合)になると起動しますが、VBでい うグローバル変数,Static変数,ヒープ上の強い参照,CPUレジスタなどは不要なメモリを検索する際のル ートとなるので、回収の対象になりません。CEでの開発経験はないのですが、極端にメモリが制限され ている状況ならば、 ・変数の配置位置を考える ・関数を細分化して、個々の関数内で完結するコードを書く(同一メソッド内で複数のIOを行わない。 もしくは明示的にファイナライゼーションを行う等々) が効果的かもしれません。分割が不可能ならばC#などのusingステートメントを利用する方法もありま す。
おそらく複数のファイルをIOするので、ヒープが満杯になる状況が連続して発生しているのだと思いま す。ガベージ対象のルートとなる上記のオブジェクトを検討してみることでいくらか効果が期待できる と思います。
特にFinalizeを実装しているクラスでは、そのオブジェクトが参照している他のオブジェクトも延命さ れてしまうので注意が必要です。このような場合は、長い処理を行う関数内であるのならDisposeメソッ ドを使用して不要になった変数は明示的にDisposeしてあげることが重要です。
このあたりのガベージコレクタの挙動は、「プログラミング .NET Framework(ISBN4-89100-303-0)」等 の書籍でわかりやすく説明されているので一度目を通してみるのも良いかと思います。
|