Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.033 c
3-1093521589
Топ
2004-08-26 15:59
2004.09.26
Дельфи+фокспро


3-1093507039
Пуртик
2004-08-26 11:57
2004.09.26
Как выполнить несколько запросов в ADO?


1-1094565117
SMT
2004-09-07 17:51
2004.09.26
Предотвращение получения фокуса ввода с клавиатуры в компонент Me


14-1094753453
iZEN
2004-09-09 22:10
2004.09.26
Покритикуйте, пожалуйста, обсуждение здесь (устал уже):


4-1092476144
_Stalker_
2004-08-14 13:35
2004.09.26
Страничная память





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский