2009-08-25 2 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; 

ли последняя строка действительно помочь? Любой другой способ справиться с этим?

NB: Это действительно не останавливает моих пользователей от продолжения использования приложения. Мне просто интересно, есть ли способ избежать избыточного использования памяти.

+2

Извлечение 1000000 может помочь – David

+3

Как? Предопределяющая память помогла много. Если позволить StringBuilder постоянно изменять размеры, это замедляет работу. – Druid

ответ

33

No, a 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() вполне допустимо, если использование памяти в приложении чрезмерно, чтобы вызвать проблемы с исчерпанием памяти. .Net сборщик мусора автоматически очистит его, когда вы пытаетесь выделить дополнительную память, а o/s голодает или в течение следующего цикла. Обычно вам это не нужно, если ваше приложение не работает очень быстро. –

1

Если «чрезмерное использование памяти» не является проблемой, я оставил бы ее такой, какой она есть, и не беспокойтесь об этом.

.NET в большинстве случаев достаточно умный, чтобы избежать сбора мусора, если у вас достаточно памяти.

2

Если вы создаете много отчетов, вы можете рассмотреть возможность повторного использования одного StringBuilder вместо выделения нового для каждого отчета.

Смежные вопросы