Форум: "Потрепаться";
Текущий архив: 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.038 c