Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Утечка памяти?   Найти похожие ветки 

 
Ihor Osov'yak ©   (2004-09-05 01:27) [0]

В общем-то, рано или позно обнаруживается пробел в експириенсе, и рано или позно этот пробел такой, что и немного стыдно :-(.
Ну ладно, что есть то есть..

Итак.

Программа периодически выполняет некоторое действие.  Раз в несколько секунд. Действие связанное с дерганием всяких там ком обьектов,  вариантных типов,  а также с динамическим выделением/освобождением памяти. По идее, память есть где терять. По окончании действия ресурсы, занятые при действии освобождаются, то есть кол-во занятой памяти должно вернуться к прежнему значению. ОС - ХП. Диспетчер задач показывает медленное, но постепеное увеличение занимаемой процессом памяти. MemProf увеличения не показывает - во всяком случае счетчики и кол-во занимаемой памяти по окончании действия возвращаются в начальное значение... MemCheck также паники не поднимает.
Если сделать специально утечку (например, GetMem без соотв. освобождения - и MemProf и MemCheck  этот момент обнаруживают).

В коде также визуально обнаружить подозрительные места  не получается..

Ну а теперь вопрос(ы).
1. Есть ли утечка памяти?
2. Если нет, то что показывает диспетчер задач?

В общем-то есть подозрение, что это диспетчер памяти при каждом новом запросе памяти выделяет фрагмент из неспользованной, но зарезервированной ранее памяти, а не только что освобожденные фрагменты. Система же о том, что с почки зрения делфийского менеджера блок был только что освобожден  не знает, и продолжает считать его занятым. И виксирует факт реального захвата нового блока.  Но рано или поздно пройдет круг (диспетчер начнет выделять фрегменты, который рантше уже были в ходу), и процесс застабилизируется... Верно ли это предположение?
Зы. Программу я естественно на несколько часов сейчас ставлю на прогонку, так что правдоподобность/ложность этой версии вскоре  буду знать..


 
jack128 ©   (2004-09-05 01:37) [1]

Ihor Osov"yak ©   (05.09.04 1:27)

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

{$o-}
// сначала нажимаешь эту кнопку
procedure TForm1.Button2Click(Sender: TObject);
var
 s: string;
begin
 s := StringOfChar("1", 100);
 p := PChar(s); // p - поле формы..
end;

// а потом эту..
procedure TForm1.Button1Click(Sender: TObject);
var
 s: string;
begin
 SetLength(s, 100);
 CAption := Format("%d %d", [Integer(p), Integer(PChar(s))]); // у меня p = PChar(s)
end;
{$o+}

> Но рано или поздно пройдет круг (диспетчер начнет
> выделять фрегменты, который рантше уже были в ходу), и
> процесс застабилизируется... Верно ли это
> предположение?
теоритически - да. На rsdn была статья про дльфийский менеджер памяти, думаю ответы на твой вопрос там.. Я эту статью не осилил, может те повезет больше ;-)


 
Ihor Osov'yak ©   (2004-09-05 01:41) [2]

2 jack128 ©   (05.09.04 01:37) [1]

Спасибо за наводку. Сейчас посмотрю, а может и утром..


 
Lenor ©   (2004-09-05 01:55) [3]

не знаю, та же проблема или нет, но симптомы похожи. Плагин для винампа AVS в полноэкранном режиме при смене картинки отъедает ощутимый кусок памяти...


 
GuAV ©   (2004-09-05 12:55) [4]

Ihor Osov"yak ©
не, знаю но почему бы ни просто смотреть System.AllocMemSize ?

Про таск манагер вот:

http://delphimaster.net/view/1-1093417979/


 
Ihor Osov'yak ©   (2004-09-05 17:16) [5]

2 GuAV ©   (05.09.04 12:55) [4]

> не, знаю но почему бы ни просто смотреть System.AllocMemSize
А почему такой вывод, что не смотрелось? Впрочем, прошу ищзвинения, я этого явно не говорил.

> Про таск манагер вот:

В той ветке инфо лишь о том, что Шевченко год назад делал просветление по этому поводу. И что "таскменеджер лжет и простых смертных это не должно волновать". Дело в том, что меня такое обьяснение не удовлетворяет.  Во первых потому что есть привычка "добивать" вопросы, которые заинтересовали, во вторых, заказчик "продвинутый" и о существовании таскменеджера знает. Я почти уверен, что ситуацию с "увеличением" "занимаемой памяти" мне придется комментировать.

Зы. Был бы очень благодарен за ссылку на материал, который "не должен волновать простых смертных". Пока ищу сам.


 
Игорь Шевченко ©   (2004-09-05 18:33) [6]


> В той ветке инфо лишь о том, что Шевченко год назад делал
> просветление по этому поводу


На самом деле просветление делали Руссинович с Соломоном. "Внутреннее устройство Windows 2000", глава 7.

Delphi имеет одно известное место, где приложение после запуска не освобождает память - это процедура MakeObjectInstance.


> 2. Если нет, то что показывает диспетчер задач?


Встречный вопрос, Игорь: диспетчер задач показывает 2 вида памяти - виртуальную и физически выделенную процессу. Какое из этих показаний TaskManager увеличивается ?


 
Ihor Osov'yak ©   (2004-09-05 18:59) [7]

2 Игорь Шевченко

>  глава 7.

ок,  начнем плавание.. Все руки не доходили..

> Какое из этих показаний TaskManager увеличивается ?

Оба.
Например:

Время  Память         Вирт.п
      (физ. ?)
18:36  14884            9256
18:40  15012            9376
18:53  15400            9736  

В то же время  System.AllocMemSize постоянно равен 13444 (проверяю в конце каждого периода)


 
Игорь Шевченко ©   (2004-09-05 19:11) [8]

Ihor Osov"yak ©   (05.09.04 18:59) [7]

Могу посоветовать программу PView[er].exe из Visual Studio или Windows Support Tools - она показывает память более подробно, чем Task Manager.

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


 
Ihor Osov'yak ©   (2004-09-05 19:24) [9]

2 Игорь Шевченко ©   (05.09.04 19:11) [8]

Ок, сейчас поищем  PView[er].exe... Благо, в свое время на ебей прикупил в американа б/у msdn subscription :-).

> это процедура MakeObjectInstance.
В моем случае - не в нем причина. Так как в цыкле сия вещь не вызывается и потомков от TWinControl не зоздается.

Спасибо за информацию.


 
Igorek ©   (2004-09-05 20:02) [10]


> Ihor Osov"yak ©   (05.09.04 01:27)  

У нас тоже была похожая проблема. Юзали СОМ обьект стороннего, но довольно серьезного производителя в Дельфи. Там был сам обьект и вьюпорт к нему цеплялся. Юзер кликал на вьюпорте больше 50 раз и прога висла. Memprof показывал утечку. Но проблему насколько я знаю мы не решили.
Что можно порекоммендовать в таком случае?


 
Игорь Шевченко ©   (2004-09-05 20:19) [11]


> Ок, сейчас поищем  PView[er].exe...


pview.exe и pviewer.exe - в разных источниках она по-разному называется.

Еще, если я не ошибаюсь, вроде бы в Jedi было какое-то средство, которое помогало отслеживать выделение/освобождение памяти. И, насколько мне помнится, MemProof позволяет вести трассировку вызовов функций работы с памятью, впрочем, опять же, могу ошибаться.



Страницы: 1 вся ветка

Текущий архив: 2004.09.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.041 c
3-1093498750
Artem123
2004-08-26 09:39
2004.09.26
Как динамически добавить в ClientDataSet поле SmallInt чтобы....


1-1095010381
QuasiLamo
2004-09-12 21:33
2004.09.26
Передача фокуса элементу управления модального окна


6-1090148252
тихий вовочка
2004-07-18 14:57
2004.09.26
Прокси


1-1094722668
kukuikar
2004-09-09 13:37
2004.09.26
Фон DBGrid...................


14-1094098942
Viking
2004-09-02 08:22
2004.09.26
О браузере...