2009-08-25 20 views
16

Jak skutecznie usunąć obiekt StringBuilder? Jeśli użytkownik generuje wiele raportów podczas jednego posiedzenia, moja aplikacja kończy się przy użyciu ogromnej ilości pamięci.Usuwanie obiektu StringBuilder

Czytałem w kilku miejscach w Internecie, że kontynuacja może pomóc:

StringBuilder sb = new StringBuilder(1000000); 

// loop goes here adding lots of stuff to sb 

exampleObject.Text = sb.ToString(); 

sb.Length = 0; 

Czy ostatnia linia naprawdę pomóc? Jakikolwiek inny sposób radzenia sobie z tym?

NB: To naprawdę nie powstrzymuje moich użytkowników od dalszego korzystania z aplikacji. Zastanawiam się tylko, czy istnieje sposób na uniknięcie zbędnego użycia pamięci.

+2

wyjęcie 1000000 może pomóc – David

+3

Jak? Wstępna alokacja pamięci bardzo pomogła. Pozwalanie ciągłej zmianie rozmiaru StringBuildera spowalniało nieco. – Druid

Odpowiedz

33

Nie, StringBuilder to czysto zarządzany zasób. Powinieneś po prostu pozbyć się wszystkich odniesień do niego. Wszystko jest załatwione przez śmieciarza:

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

W .NET, nie ma deterministyczne delete (jak C++, gdzie można zwolnić pamięć przydzieloną do pojedynczego obiektu.) Tylko GC może uwolnić pamięć. Przez utratę wszystkich odniesień do obiektu, umożliwisz GC zdekalowanie obiektu, jeśli tego chce. Możesz wymusić zbieranie śmieci, wywołując metodę System.GC.Collect. Jednak nie zaleca się manipulowania z GC, chyba że naprawdę wiesz, co robisz. GC jest inteligentny. Rzadko kiedy go wymuszam.

+1

dodanie GC.Collect() jest całkowicie poprawne, jeśli wykorzystanie pamięci w aplikacji jest zbyt wysokie, aby spowodować problemy z wyczerpaniem pamięci. Usuwanie śmieci .Net automatycznie oczyści go, gdy próbujesz przydzielić dodatkową pamięć i o/s jest głodzona lub podczas następnego cyklu. Zwykle nie jest to konieczne, chyba że Twoja aplikacja jest bardzo wydajna. –

1

O ile "nadmierne użycie pamięci" nie stanowi problemu, pozostawiłbym go w niezmienionym stanie i nie martwię się o niego.

.NET jest w większości przypadków wystarczająco inteligentny, aby uniknąć wywozu śmieci, jeśli dostępna jest wystarczająca ilość pamięci.

2

Jeśli generujesz wiele raportów, możesz rozważyć ponowne użycie pojedynczego StringBuilder zamiast przydzielania nowego dla każdego raportu.