2009-08-25 21 views
16

StringBuilderオブジェクトを効果的に処分するにはどうすればよいですか?ユーザーが一度に複数のレポートを生成すると、膨大な量のメモリを使用してアプリケーションが終了します。StringBuilderオブジェクトを廃棄する

私がフォローを助けるかもしれないことを、オンラインでいくつかのサイトで読んだ:

StringBuilder sb = new StringBuilder(1000000); 

// loop goes here adding lots of stuff to sb 

exampleObject.Text = sb.ToString(); 

sb.Length = 0; 

最後の行には本当に助けていますか?これに対処する他の方法?

注:これは、ユーザーがアプリケーションの使用を続けることを実際に停止するわけではありません。私はちょうど冗長メモリの使用を避ける方法があるかどうか疑問に思っています。

+2

1000000を取り出すと助けになる可能性があります – David

+3

どうやって?メモリをあらかじめ割り当てておくと多くの助けになりました。 StringBuilderを常にサイズ変更させると、かなり減速していました。 – Druid

答えて

33

いいえ、StringBuilderは純粋に管理されたリソースです。あなたはちょうどそれへのすべての参照を取り除く必要があります。他のすべては、ガベージコレクタによって世話をされています

StringBuilder sb = ...; 
// ... do work 
sb = null; // or simply let it go out of scope. 

は、.NETでは、何の決定論delete(。あなたは、単一のオブジェクトに割り当てられたメモリを解放するC++など)のみGCがメモリを解放することはできませんがあります。オブジェクトへのすべての参照を没収することで、必要に応じてGCがオブジェクトの割り当てを解除できるようになります。ガベージコレクションを強制するには、System.GC.Collectメソッドを呼び出します。しかし、実際にあなたが何をしているのかわからない限り、GCで操作することはお勧めしません。 GCはスマートです。それを強制することはめったに有益ではありません。

+1

GC.Collect()を追加すると、アプリケーション内のメモリ使用率がメモリ不足の問題を引き起こす点で過度である場合、完全に有効になります。追加のメモリを割り当てようとしていて、o/sが不足しているとき、または次のサイクル中に.Netガベージコレクションが自動的にそれをクリーンアップします。通常、アプリのパフォーマンスが非常に高い場合を除いて、このアプリは必要ありません。 –

1

「過度のメモリ使用量」が問題でない限り、そのまま残しておき、心配する必要はありません。

.NETはほとんどの場合、メモリが十分にある場合はガベージコレクションを行わないほどスマートです。

2

多くのレポートを生成する場合、レポートごとに新しいレポートを割り当てる代わりに、1つのStringBuilderを再利用することを検討できます。

関連する問題