Stanly Simon Trivandrum Ответов: 4

Как исправить утечку памяти в Microsoft Report (rdlc)


Дорогие Все,

Мое приложение C# Windows использует microsoft report (rdlc).
Я обнаружил высокую загрузку памяти при запуске отчета.
Позже я узнал, что microsoft report имеет проблему утечки памяти.
Я использую .Net 4.0 и Visual Studio 2010.

Есть ли какое-либо решение или исправление для этой проблемы ?

Это очень срочно ! ! !

Sergey Alexandrovich Kryukov

Откуда ты знаешь, что это утечка информации? Если это из Диспетчера задач Windows, не доверяйте ему.
—СА

Stanly Simon Trivandrum

Я нашел это с помощью CLR Profiler

Stanly Simon Trivandrum

также используя dotTrace

4 Ответов

Рейтинг:
27

MetalKid007

У меня есть реальное решение, и я могу объяснить, почему!

It turns out that LocalReport here is using .NET Remoting to dynamically create a sub appdomain and run the report in order to avoid a leak internally somewhere. We then notice that, eventually, the report will release all the memory after 10 to 20 minutes. For people with a lot of PDFs being generated, this isn't going to work. However, the key here is that they are using .NET Remoting. One of the key parts to Remoting is something called "Leasing". Leasing means that it will keep that Marshal Object around for a while since Remoting is usually expensive to setup and its probably going to be used more than once. LocalReport RDLC is abusing this.

По умолчанию время аренды составляет... 10 минут! Кроме того, если что-то делает различные звонки в него, это добавляет еще 2 минуты к времени ожидания! Таким образом, это может быть случайным образом от 10 до 20 минут в зависимости от того, как выстраиваются звонки. К счастью, вы можете изменить время ожидания. К сожалению, вы можете установить это только один раз для каждого домена приложения... Таким образом, если вам нужно удаленное взаимодействие, отличное от генерации PDF, вам, вероятно, потребуется создать другую службу, запускающую его, чтобы вы могли изменить значения по умолчанию. Для этого все, что вам нужно сделать, это запустить эти 4 строки кода при запуске:

LifetimeServices.LeaseTime = TimeSpan.FromSeconds(5);
LifetimeServices.LeaseManagerPollTime = TimeSpan.FromSeconds(5);
LifetimeServices.RenewOnCallTime = TimeSpan.FromSeconds(1);
LifetimeServices.SponsorshipTimeout = TimeSpan.FromSeconds(5);


Вы увидите, что использование памяти начинает расти, а затем в течение нескольких секунд вы должны увидеть, что память начинает возвращаться вниз. Мне потребовалось несколько дней с помощью профилировщика памяти, чтобы действительно отследить это и понять, что происходит.

Надеюсь, это поможет!


Рейтинг:
2

Tora_Valenzuela

У меня была та же проблема с .NET 4.5 VS 2013

Я попробовал несколько вещей, но то, что в конце концов заставило его работать, было:

Компиляция проекта в x64 и использование LocalReport.ReleaseSandBoxAppDomain()

Я получил часть решения отсюда: http://stackoverflow.com/questions/6220915/very-high-memory-usage-in-net-4-0/34184809#34184809[^]