![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прога жрет память. Ваше мнение ? [D5, NT4, Win2k]
maxi © (2002-06-23 00:50:00)Проблема така:
У меня написана довольно большая прога, код которой я здесь приводить не буду. В ней происходит работа с ListBox-ами.
Всего их 4. Каждую секунду выполняется примерно следующее для каждого из ListBox-ов.
begin
MM := MyClass.Create;
MM.A := Round(random(999999));
MM.B := random(9999999)/3;
MM.C := IntToStr(Round(random(999999)));
ListBox1.Items.AddObject(MM.C,TObject(MM));
end;
После достижения определенного количества записей в ListBox -ах(например 1000) + (а таймер на заполнение продолжает считать), я удаляю часть этих записей в каждом ListBox-е, так что остается примерно половина от первоначального объема. Делаю я это так:
for i := 1 to 500 (например) do
begin
MM := MyClass(ListBox1.Items.Objects[0]);
MM.Free;
ListBox1.Items.Objects[0] := nil;
ListBox1.Items.Delete(0);
end;
Однако Вместо того, чтобы сократилась половина всей памяти, которую я схавал до момента удаления, освобождается малая толика.
Из-за этого размер проги продолжает расти.
Что интересно, что если я сворачиваю прогу и разворачиваю её, то происходят метаморфозы в занимаемом программой объеме (так пишет таскменеджер на NT4_0). Так до сворачивания прога была 13 метров,
а после того как свернул, развернул - 4 с небольшим....
Что это ? Глюк операционной системы ?
Слышал о фрагментации памяти - типа система иногда не использует нефрагментированными области памяти ... Так ли это ?
А самое интересное - прога очень долго закрывается, т.е. памяти всётаки жрется много ....
Уважаемые мастера, что делать то ? Подскажите...
maxi (2002-06-29 14:29:00) [1]Разобрался !!!! :о)
Всё дело в DOA компоненте - жрется память под каждый запрос.
Если делать запрос к базе каждую секунду, то сжор памяти составляет 100 кБайт в минуту !!!!!!!!!
Но это уже не в этот форум. Всем кто участвовал - спасибо...
Wizard_Ex (2002-06-29 13:51:00) [2]Ты все таки напиши код как у Polevi
// Polevi © (23.06.02 17:49)
Он получше, хотя такой же
maxi (2002-06-29 08:37:00) [3]Ау, ответьте пожалуйста, а то дело катастрофическое - прога зажрала уже 53 метра, а GetHeapStatus показывает, что всё в порядке... Почему так ?????
maxi (2002-06-26 23:11:00) [4]Хорошо, но вот я стал разбираться и заметил :
Функция GetHeapStatus выдает мне, что
TotalCommited = 1600 кБ
TotalAllocated = 1400 кБ
FreeSmall = 1100 кБ
При этом, FreeSmall и BigSmall постоянно меняются, TotalAllocated
тоже меняется, но скачком, когда я записи из ListBox - ов удаляю (а иже с ними и объекты связанные). Всё вроде хорошо, с точки зрения GetHeapStatus, однако если я запускаю прогу утром - она 8 метров, а смотрю вечером - она 17 метров... При этом, GetHeapStatus показывает примерно одни и теже значения ....
Тоесть, с точки зрения GetHeapStatus, я всё делаю правильно - память выделяю-освобождаю, а с точки зрения операционки - нет - программе всё время требуется память. Сейчас на машине 192 метра, и вроде бы проблема решена, но хотелось бы узнать - почему так происходит, и зачем операционка выделяет памяь ????
С уважением ....
Макс Черных (2002-06-23 20:47:00) [5]
> Что интересно, что если я сворачиваю прогу и разворачиваю
> её, то происходят метаморфозы в занимаемом программой объеме
> (так пишет таскменеджер на NT4_0). Так до сворачивания прога
> была 13 метров,
> а после того как свернул, развернул - 4 с небольшим....
> Что это ? Глюк операционной системы ?
Это совершенно нормальная ситуация NT всегда так работает.
Память программы которую показывает таскменеджер в NT/XP
не есть память которую использует программа, а есть память
выделеннаяОС программе. Это совсем не одно и тоже.
Выделенное значение всегда больше реально необходимого
и устанавливается с учетом текущей потребности программы,
статистики запросов программой памяти у ОС, физического объема
ОС и ряда других факторов. При сворачивании программы пул памяти
выделенный на нее уменьшается. Кроме того временно высвобожается
оперативная память занимаемая оконными элементами проги на уровне ОС.
Несмотря на кажущуюся мудреность, такой порядок вещей
позволяет существенно повысить производительность ОС.
> А самое интересное - прога очень долго закрывается, т.е.
> памяти всётаки жрется много ....
А вот это не критерий. Я вот ремонт делаю, и в Archicad планы
рисую. 100 Мегов памяти жрет, а закрывается мнговенно.
Polevi (2002-06-23 17:49:00) [6]извини, ошибся, все нормально
просто я обычно делаю так
for i := 500 downto 0 (например) do
begin
MyClass(ListBox1.Items.Objects[i]).Free
ListBox1.Items.Delete(i);
end;
Polevi (2002-06-23 17:45:00) [7]for i := 500 downto 0 (например) do
begin
MM := MyClass(ListBox1.Items.Objects[0]);
MM.Free;
ListBox1.Items.Objects[0] := nil;
ListBox1.Items.Delete(0);
end;
maxi (2002-06-23 05:36:00) [8]Ну и что, никто не знает ... ?