Сборка мусора строк, возвращаемых из вызовов метода C # на страницах ascx - PullRequest
3 голосов
/ 18 марта 2010

Для веб-приложения, разработанного на ASP.NET, мы обнаруживаем, что для пользовательских файлов управления (ascx) мы возвращаем длинные строки в результате вызовов методов. Они встроены в ascx-страницы с помощью специальных тегов <% %>

При выполнении анализа дампа памяти для приложения мы обнаруживаем, что многие из этих строк не являются сборщиком мусора. Кроме того, ascx-страницы компилируются во временные библиотеки DLL и хранятся в памяти. Отвечает ли это за то, чтобы длинные строки оставались в памяти и не собирались мусором?

Примечание. Размер строк превышает 85 КБ.

Ответы [ 2 ]

2 голосов
/ 24 марта 2010

Ваши строки расположены в куче больших объектов, которые не собираются вместе с другими небольшими объектами. Он использует другой порог, как объяснено Тесс Феррандез . Как она советует, вы можете попробовать позвонить

GC.Collect(3)
GC.WaitForPendingFinalizers()
GC.Collect(3)

и посмотрите, собираются ли они.

2 голосов
/ 18 марта 2010

Если они генерируются как строковые литералы, то, скорее всего, они интернированы. Внутренняя строка вряд ли будет выпущена в течение всего времени жизни приложения. Это объясняет, почему переменная не собирается.

Это можно проверить, пометив сборку атрибутом CompilationRelaxations и флагом NoStringInterning.

Свойство Intern в System.String содержит много информации по этому вопросу в разделе Performance

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...