Memory leak in .NET windows service
От: RustamR Украина  
Дата: 29.09.06 07:54
Оценка:
Приветствую!

Возникла проблема с утечкой памяти при запуске приложения написанного на .NET как Windows сервиса. Изначально программа была разработана как клиентское Desktop приложение, но возникла необходимость запускать ее как сервис. Приложение обменивается данными с сервером через Remoting. Проблем с памятью не было. Но как только попытались его запустить в качестве сервиса возникла проблема с тем, что растет кол-во виртуальной памяти захваченной программой и она не освобождается.

Подскажите, есть ли возможность этим явлением бороться и как.

Рустам.
Sincerely,
Рустам.
Memory leak in .NET windows service
От: Аноним  
Дата: 29.09.06 08:30
Оценка:
И тебе того же

Для начала нужно сделать ревизию кода на предмет поиска массивов, arraylist`ов и прочих коллекций... убедиться, что всё это _явно_ освобождается (выход за границы видимости и _явное_ освобождение не одно и тоже)...

DataTable getData(...)
{
DataTable result = new DataTable();
return result;
}

// это —
DataTable dt = getData(...);
dt.Rows.Add(...)

// это —
using (DataTable dt = getData(...))
{
dt.Rows.Add(...)
}
разницу уловил?
= * = * = * =
С уважением, Дмитрий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Memory leak in .NET windows service
От: Igor Trofimov  
Дата: 29.09.06 08:56
Оценка: 15 (1)
sdn>// это —
sdn>using (DataTable dt = getData(...))

Пример плохой. DataTable не содержит unmanaged-ресурсов и реализует IDisposable по совершенно непонятным причинам.

А проверить, не течет ли где-то память, в т.ч. в сервисе, можно спомощью .NET Memory Profiler
Memory leak in .NET windows service
От: oleksab Украина  
Дата: 29.09.06 09:13
Оценка: 55 (3)
#Имя: FAQ.dotnet.sta.memory.leak
Здравствуйте, RustamR, Вы писали:

RR>Изначально программа была разработана как клиентское Desktop приложение, но возникла необходимость запускать ее как сервис. Но как только попытались его запустить в качестве сервиса возникла проблема с тем, что растет кол-во виртуальной памяти захваченной программой и она не освобождается.

RR>Подскажите, есть ли возможность этим явлением бороться и как.

Попробуй поставить MTAThread атрибут для метода Main сервиса (Udi Dahan):

So, why does this cause a memory leak in a multithreaded system? Here’s Chris’ answer:

“If you have an STA thread, you are responsible for pumping it. When your code is in a DLL, the thread is MTA and you don’t need to pump it.

Like you, I assumed that SqlClient was all managed and there is no COM Interop involved. However, I would not be shocked to find out that a COM object is used for some aspect of it. Not only that, but operations like the clipboard, or listening to SystemEvents, and a number of other activities can involve COM objects.

If even a single COM object is created, and if your STA is not pumping, then this can cause the Finalizer thread to become stuck trying to Release that pUnk. Then if SqlClient or something else is creating a bunch of finalizable instances, they will be leaked until the STA thread is pumped.

One way to verify this is to wait until the leak is evident, then break in with a debugger and see what the Finalizer thread is doing. Most likely it is sitting in an OLE32 GetToSTA or similar call. And the STA thread is probably doing something other than pumping. If the debugger shows you the Finalizable instance that is being processed, the mystery will be solved.”

... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[2]: Memory leak in .NET windows service
От: Mika Soukhov Stock#
Дата: 29.09.06 09:38
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

sdn>>// это —

sdn>>using (DataTable dt = getData(...))

iT>Пример плохой. DataTable не содержит unmanaged-ресурсов и реализует IDisposable по совершенно непонятным причинам.


Он ему в наследство достался.

Кстати, вспоминаю тут наш код, видел как-то такую ситуацию. Открывается файл, из него читаются данные, и он закрывается через метод Close. Никакой обработки ошибок. А ниже, буквально на 10 строчек, используется MemoryStream, который обрамлен в конструкцию using.
Re[2]: Memory leak in .NET windows service
От: Pavel M. Россия  
Дата: 29.09.06 10:04
Оценка:
Здравствуйте, oleksab, Вы писали:

O>Здравствуйте, RustamR, Вы писали:


O>запустить в качестве сервиса возникла проблема с тем, что растет кол-во виртуальной памяти захваченной программой и она не освобождается.

RR>>Подскажите, есть ли возможность этим явлением бороться и как.

O> Попробуй поставить MTAThread атрибут для метода Main сервиса (Udi Dahan).


Хорошая статья.
--------------------------
less think — do more
Re: Memory leak in .NET windows service
От: zrs  
Дата: 29.09.06 13:01
Оценка:
Здравствуйте, RustamR, Вы писали:

Возможно ваш случай описан здесь.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: Memory leak in .NET windows service
От: RustamR Украина  
Дата: 04.10.06 09:03
Оценка:
Приветствую!

sdn>Для начала нужно сделать ревизию кода на предмет поиска массивов, arraylist`ов и прочих коллекций... убедиться, что всё это _явно_ освобождается (выход за границы видимости и _явное_ освобождение не одно и тоже)...


skip

В коде присутсвует достаточное большое кол-во Hashtable'ов. Спасибо за рекомендацию. Но иногда они являются полями классов объекты которых периодически надо создавать. Подумаю как можно обойти эту ситуацию тоже.

Спасибо за присланные ссылки.

Sincerely,

Рустам.
Sincerely,
Рустам.
Re: Memory leak in .NET windows service
От: Аноним  
Дата: 04.10.06 09:12
Оценка:
У меня подобная проблема полность разрешилась засовыванием соединений с базой в конструкцию using(connection...).
--
Абыpвалг! — сказал Linux после pyсификации


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Memory leak in .NET windows service
От: registered anonymous  
Дата: 04.10.06 20:39
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Пример плохой. DataTable не содержит unmanaged-ресурсов и реализует IDisposable по совершенно непонятным причинам.


А что такого непонятного для наследника MarshalByValueComponent? И еще: из поста сквозит, что реализация IDisposable подразумевает наличие unmanaged-ресурсов... Лично я не раз создавал классы без unmanaged-ресурсов, реализующих IDisposable — чисто ради удобства (C#, using), хотя, справедливости ради, во Framework такое не практиуется.
Re[3]: Memory leak in .NET windows service
От: registered anonymous  
Дата: 04.10.06 20:48
Оценка:
Здравствуйте, registered anonymous, Вы писали:

RA>Здравствуйте, Igor Trofimov, Вы писали:


iT>>Пример плохой. DataTable не содержит unmanaged-ресурсов и реализует IDisposable по совершенно непонятным причинам.


RA>А что такого непонятного для наследника MarshalByValueComponent? И еще: из поста сквозит, что реализация IDisposable подразумевает наличие unmanaged-ресурсов... Лично я не раз создавал классы без unmanaged-ресурсов, реализующих IDisposable — чисто ради удобства (C#, using), хотя, справедливости ради, во Framework такое не практиуется.


я, конечно, понимаю, что реализация IDisposable сигнализирует о нетривиальной очистке, и реализовывать его просто ради удобства использования в коде может и не есть хороший тон, но все же...
Re[3]: Мысли вслух...
От: registered anonymous  
Дата: 04.10.06 21:10
Оценка:
Здравствуйте, registered anonymous, Вы писали:

Хорошо бы, наверное, для подслащения горечи бывших С++ — ов, добавить какой-нибудь новый интерфйес, типа IRaii c языковой поддержкой, как using... Чтобы без лишних приседаний вроде написания try-finally...
Re[2]: Memory leak in .NET windows service
От: Аноним  
Дата: 05.10.06 04:32
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

sdn>>// это —

sdn>>using (DataTable dt = getData(...))

iT>Пример плохой. DataTable не содержит unmanaged-ресурсов и реализует IDisposable по совершенно непонятным причинам.


Я бы не был на вашем месте столь категоричным ....

--
хвы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.