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

Вниз

Прога жрет память. Ваше мнение ?   Найти похожие ветки 

 
maxi   (2002-06-23 00:50) [0]

Проблема така:
У меня написана довольно большая прога, код которой я здесь приводить не буду. В ней происходит работа с 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-23 05:36) [1]

Ну и что, никто не знает ... ?


 
Polevi   (2002-06-23 17:45) [2]

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;


 
Polevi   (2002-06-23 17:49) [3]

извини, ошибся, все нормально
просто я обычно делаю так

for i := 500 downto 0 (например) do
begin
MyClass(ListBox1.Items.Objects[i]).Free
ListBox1.Items.Delete(i);
end;




 
Макс Черных   (2002-06-23 20:47) [4]


> Что интересно, что если я сворачиваю прогу и разворачиваю
> её, то происходят метаморфозы в занимаемом программой объеме
> (так пишет таскменеджер на NT4_0). Так до сворачивания прога
> была 13 метров,
> а после того как свернул, развернул - 4 с небольшим....
> Что это ? Глюк операционной системы ?
Это совершенно нормальная ситуация NT всегда так работает.
Память программы которую показывает таскменеджер в NT/XP
не есть память которую использует программа, а есть память
выделенная ОС программе. Это совсем не одно и тоже.
Выделенное значение всегда больше реально необходимого
и устанавливается с учетом текущей потребности программы,
статистики запросов программой памяти у ОС, физического объема
ОС и ряда других факторов. При сворачивании программы пул памяти
выделенный на нее уменьшается. Кроме того временно высвобожается
оперативная память занимаемая оконными элементами проги на уровне ОС.
Несмотря на кажущуюся мудреность, такой порядок вещей
позволяет существенно повысить производительность ОС.

> А самое интересное - прога очень долго закрывается, т.е.
> памяти всётаки жрется много ....


А вот это не критерий. Я вот ремонт делаю, и в Archicad планы
рисую. 100 Мегов памяти жрет, а закрывается мнговенно.


 
maxi   (2002-06-26 23:11) [5]

Хорошо, но вот я стал разбираться и заметил :
Функция GetHeapStatus выдает мне, что
TotalCommited = 1600 кБ
TotalAllocated = 1400 кБ
FreeSmall = 1100 кБ
При этом, FreeSmall и BigSmall постоянно меняются, TotalAllocated
тоже меняется, но скачком, когда я записи из ListBox - ов удаляю (а иже с ними и объекты связанные). Всё вроде хорошо, с точки зрения GetHeapStatus, однако если я запускаю прогу утром - она 8 метров, а смотрю вечером - она 17 метров... При этом, GetHeapStatus показывает примерно одни и теже значения ....
Тоесть, с точки зрения GetHeapStatus, я всё делаю правильно - память выделяю-освобождаю, а с точки зрения операционки - нет - программе всё время требуется память. Сейчас на машине 192 метра, и вроде бы проблема решена, но хотелось бы узнать - почему так происходит, и зачем операционка выделяет памяь ????
С уважением ....


 
maxi   (2002-06-29 08:37) [6]

Ау, ответьте пожалуйста, а то дело катастрофическое - прога зажрала уже 53 метра, а GetHeapStatus показывает, что всё в порядке... Почему так ?????


 
Wizard_Ex   (2002-06-29 13:51) [7]

Ты все таки напиши код как у Polevi
// Polevi © (23.06.02 17:49)
Он получше, хотя такой же


 
maxi   (2002-06-29 14:29) [8]

Разобрался !!!! :о)
Всё дело в DOA компоненте - жрется память под каждый запрос.
Если делать запрос к базе каждую секунду, то сжор памяти составляет 100 кБайт в минуту !!!!!!!!!
Но это уже не в этот форум. Всем кто участвовал - спасибо...



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

Форум: "WinAPI";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
14-3618
MBo
2002-08-07 12:35
2002.09.02
Еще задачки ;)


1-3509
proc
2002-08-21 12:28
2002.09.02
Font в PageControl


3-3297
cherepovets
2002-08-09 15:25
2002.09.02
Paradox


6-3541
KAA
2002-06-23 18:03
2002.09.02
Indy 8 компоненты не освобождают память


14-3608
Извращенец
2002-07-30 15:50
2002.09.02
WinMe





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский