Re[3]: Жор памяти
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 03.02.04 17:42
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

M>>А с чего ты так решил?


iT>А в TaskManager посмотрели.

В TaskManager посмотрели ты видишь не выделенную а зарезервированную память. Сам не пробовал но читал, что если сложить всю выделеннум память под процессы видимую в
TaskManager то ее будет намного больше. Просто резервируются адреса для дальнейшего использования. Кстати эффект уменьшения памяти в TaskManager можно замечать при сворачивании приложения или воспользоваться SetProcessWorkingSetSize например в
http://www.gotdotnet.ru/DotNet/FAQ/CommonForum/524.aspx
А вот если данные манипуляции не помогут то тогда уже рыть ....
и солнце б утром не вставало, когда бы не было меня
Re[3]: Жор памяти
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 03.02.04 18:06
Оценка: 12 (1)
Здравствуйте, Igor Trofimov, Вы писали:

Попробуй http://www.microsoft.com/rus/msdn/magazine/archive/2003-01/projection.asp
Можешь скачать исходники
http://www.microsoft.com/rus/msdn/magazine/archive/2003-01/
и солнце б утром не вставало, когда бы не было меня
Re[4]: Жор памяти
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 03.02.04 18:08
Оценка:
Здравствуйте, Serginio1, Вы писали:

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


Извини вот полная статья
http://www.microsoft.com/rus/msdn/magazine/archive/2003-01/full_projection.asp
и солнце б утром не вставало, когда бы не было меня
Re[5]: Жор памяти
От: Igor Trofimov  
Дата: 03.02.04 18:49
Оценка:
Прикольно, надо будет попробовать...
Спасибо, интересная ссылочка.
Re: Жор памяти
От: Igor Trofimov  
Дата: 06.02.04 08:20
Оценка:
Итак, докладываю результаты маленьких исследований.

1. Выяснилось, что классическая связка
   GC.Collect;
   GC.WaitForPendingFinalizers;
   GC.Collect;

зависает на второй строке... отчего это может быть?

2. Выяснилось (спасибо хорошей утильке под названием .net memory profiler), что основной объем памяти отжирает некий System.DirectoryServices.Interop.AdsValueHelper. действительно, прога регулярно обращается к AD, но при этом я делаю using для всего, что шевелится.. тьфу.. для всего, что IDisposable..

Тем не менее этих самых AdsValueHelper накапливается сотни тысяч, они не умирают, и судя по stack trace'ам (которые показывает та же утилька) их создают внутренние механизмы классов DirectoryServices при работе обычных (не IDiposable) SearchResultCollection, .

Что посоветуете? Сталкивался ли кто-то с такой проблемой при работе с AD?
Re[2]: Жор памяти
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.02.04 09:57
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Итак, докладываю результаты маленьких исследований.


iT>1. Выяснилось, что классическая связка

iT>
iT>   GC.Collect;
iT>   GC.WaitForPendingFinalizers;
iT>   GC.Collect;  
iT>

iT>зависает на второй строке... отчего это может быть?
Кстати в этом же номере Джеффри Рихтер
http://www.microsoft.com/rus/msdn/magazine/archive/2003-01/dotnet.asp
Как раз рассматривал GC.WaitForPendingFinalizers; при взаимной блокировке.
Скорей всего, чтото в финализаторе блокируется.
и солнце б утром не вставало, когда бы не было меня
Re[2]: Жор памяти
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.02.04 10:15
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>2. Выяснилось (спасибо хорошей утильке под названием .net memory profiler), что основной объем памяти отжирает некий System.DirectoryServices.Interop.AdsValueHelper. действительно, прога регулярно обращается к AD, но при этом я делаю using для всего, что шевелится.. тьфу.. для всего, что IDisposable..


Самое интнресное, что у этого System.DirectoryServices.Interop.AdsValueHelper нет
IDisposable, но есть Finalize который должен перекрываться в наследниках.


protected override void Finalize()
{ try
{
if (this.pinnedHandle.IsAllocated)
{
this.pinnedHandle.Free();

}

}
finally
{
base.Finalize();

}

}
и солнце б утром не вставало, когда бы не было меня
Re[3]: Жор памяти
От: Igor Trofimov  
Дата: 06.02.04 11:23
Оценка:
S> Самое интнресное, что у этого System.DirectoryServices.Interop.AdsValueHelper нет
S>IDisposable, но есть Finalize который должен перекрываться в наследниках.

В каком смысле — "должен перекрываться в наследниках"? Он вроде и так все, что нужно — делает..
Вот только почему-то не умирают эти самые AdsValueHelper'ы ;(
Re[4]: Жор памяти
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.02.04 11:43
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

S>> Самое интнресное, что у этого System.DirectoryServices.Interop.AdsValueHelper нет

S>>IDisposable, но есть Finalize который должен перекрываться в наследниках.


iT>В каком смысле — "должен перекрываться в наследниках"? Он вроде и так все, что нужно — делает..

iT>Вот только почему-то не умирают эти самые AdsValueHelper'ы ;(
Тогда откуда должен вызываться Finalize, т.к. он протектед.
А вообще он сборочный, а ссылки на него из сборкин нет ни их одного класса.
Надо смотреть откуда он создается.
и солнце б утром не вставало, когда бы не было меня
Re[5]: Жор памяти
От: Igor Trofimov  
Дата: 06.02.04 12:05
Оценка:
Finalize вообще-то всегда protected. CLR это не мешает

S> А вообще он сборочный, а ссылки на него из сборкин нет ни их одного класса.

S>Надо смотреть откуда он создается.

profiler говорит, что создается он в SearchResultCollection.ResultsEnumerator.GetCurrentResult()
а еще в DirectorySearcher.SetSearchPreferences(...).

Смотрю Reflector'ом — и там и там действительно создается экземпляр этого типа (не потомка), (так что Reflector зря не показывает ссылку на этот тип).

Вот только мало это проясняет, увы...
Re: Жор памяти
От: Igor Trofimov  
Дата: 06.02.04 17:14
Оценка:
Блин, что же делать?
неужели никто не работал массировано с AD и не наталкивался на эти траблы?
Re[2]: Жор памяти
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.02.04 17:42
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Блин, что же делать?

iT>неужели никто не работал массировано с AD и не наталкивался на эти траблы?
Ради подддержания двнного топика...
и солнце б утром не вставало, когда бы не было меня
Re[6]: Жор памяти
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.02.04 10:25
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Finalize вообще-то всегда protected. CLR это не мешает


Прошу прощения. Пить мне надо меньше. Конечно же это деструктор, а Finalize формируемый автоматом.
И самое противное, что без IDisposable вызывается только при сборке мусора, и никакие using не помогут.
И здесь интересно
GC.Collect;
GC.WaitForPendingFinalizers;
GC.Collect;


зависает на второй строке... отчего это может быть?
Зависает бог с ним. А после него память высвобождается???
и солнце б утром не вставало, когда бы не было меня
Re[3]: Жор памяти
От: mihailik Украина  
Дата: 09.02.04 10:27
Оценка:
iT>А в TaskManager посмотрели.

Нужно повключать побольше колонок в Task Manager'е и прикинуть, что вообще каждая из них означает.

Увеличение какого-то показателя не обязательно говорит об утечках и т.п. Это разве что повод задуматься, но не разворачивать бурную деятельность по оптимизации "под TaskManager".


Вообще, трудно диагностируемые утечки бывают к примеру в таких случаях:

Неадекватная работа с COM.
Работа с БД Access.
Непродуманное использование Reflection.Emit, CodeDom и подключаемых сборок-плугинов.
Слишком широкое использование компилируемых регекспов.
... << RSDN@Home 1.1.3 beta 1 >>
Re[7]: Жор памяти
От: Igor Trofimov  
Дата: 09.02.04 11:48
Оценка:
S>И здесь интересно
S> GC.Collect;
S> GC.WaitForPendingFinalizers;
S> GC.Collect;
S> Зависает бог с ним. А после него память высвобождается???

Не-а.
Re[8]: Жор памяти
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.02.04 11:57
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

S>>И здесь интересно

S>> GC.Collect;
S>> GC.WaitForPendingFinalizers;
S>> GC.Collect;
S>> Зависает бог с ним. А после него память высвобождается???

iT>Не-а.

То есть профайлер показывает то же количество этих долбанных объектов????
А если несколько раз коллектнуть???
И в чем могут быть проблемы???
if (this.pinnedHandle.IsAllocated)
{
this.pinnedHandle.Free();

}
или base.Finalize();
и солнце б утром не вставало, когда бы не было меня
Re[2]: Жор памяти
От: mihailik Украина  
Дата: 09.02.04 18:19
Оценка:
iT>зависает на второй строке... отчего это может быть?

Например, в каком-нибудь финализере или Dispose стоит lock. Или что-нибудь похожее на более низком уровне.

Постарайся не разбрасываться объектами по разным потокам, может поможет. На крайний случай можно вообще отдельный AppDomain для продолжительных гнусностей создавать. Оно и ссылки подчистит.
... << RSDN@Home 1.1.3 beta 1 >>
Re[3]: Жор памяти
От: mihailik Украина  
Дата: 09.02.04 18:19
Оценка:
S> this.pinnedHandle.Free();

Ага, может они память пинуют и не сразу распинуют?!

Я тут недавно кидал ссылку на похожую проблему в System.Net.Socket, которая будет исправлена в Widbey.

Пока память запинована, GC не может освободить всё, что следует перед этим пинованым указателем в куче. Поэтому не рекомендуется пиноваться слишком часто. Возможно, мелкософтовцы это прохлопали.
... << RSDN@Home 1.1.3 beta 1 >>
Re[9]: Жор памяти
От: mihailik Украина  
Дата: 09.02.04 18:19
Оценка:
S> И в чем могут быть проблемы???
S> if (this.pinnedHandle.IsAllocated)

Скорее всего в слишком настырном пиновании. Пишите репорт, глядишь они исправят в следующем Framework.
... << RSDN@Home 1.1.3 beta 1 >>
Re: Жор памяти
От: Igor Trofimov  
Дата: 24.02.04 09:51
Оценка:
В общем, если кому интересно, вынес я работу с AD в отдельный AppDomain и все стало шоколадно. Поработал — грохнул. Поработал — грохнул.

На досуге надо будет еще проверить на маленьком тесте — действительно ли любое использование AD блокирует сборку мусора или это у меня какое-то особо неприятное стечение обстоятельств было.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.