Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы с диспетчером памяти..? [D5, Win2k]


Страницы:   1 2

arm79 ©   (2004-08-05 18:14:00) 

Уважаемые мастера! Возникла неприятная ситуация с размерами занимаемой моей программой памяти. Работа идет с большим кол-вом списков и элементов в нем. Часто приходится удалять эти элемены и списки. На первый взгляд выделение и очистка памяти написаны корректно. Выдаваемые данные не искажаются, программа работает, функции выполняет. Но к концу дня "жрет" виртуальной памяти под гигабайт. В связи с этим вопрос, а высвобождаемое место при FreeMem повторно используется? Или виндовый диспетчер памяти не хочет увидеть кусочки такой памяти свободными? То есть я просто хочу знать, это моя прога однозначно виновата(в том плане, что я где то забываю освободить память) или есть вероятность, что диспетчер памяти в Win2000 некорректно работает? Программу приводить не буду, она слишком объемная, но если кто хочет, могу переслать по почте модуль, в котором идет работа со списками.
ЗЫ Удаляемые списки содержат указатели на целые числа. При удалении таких списков я сначала освобождаю память, на которую ссылаются элементы списка, потом вызываю метод Clear + FreeAndNil (или Free)


Digitman   (2004-08-06 14:03:00) [21]

а в чем "прелесть" выделения 4-х байт обращением к ВММ ? с гораздо большим успехом и с неизмеримо меньшим геморроем можно и лок.переменную задать и использовать для такой цели


GuAV   (2004-08-06 14:02:00) [22]

Мне вот что интересно: на кой выделять 4 байта, если sizeof(pointer) = 4 ? Какой нибудь пример из этой самой проги можно?


Дуся   (2004-08-06 13:51:00) [23]

Вместе с arm79проверяли, на первый взгляд - все getmem и create корректно потом освобождаются.. при этом подозрение вызывает только ОРГОМНОЕ их количество в коде... и то что выделяется по 4 байтика (на ИНТ)..
про страницы - очень интересно!.. может быть как раз и портит все такой маленький объем (4б)??


GuAV   (2004-08-06 12:39:00) [24]


> AllocMemSize - тоже прирастает.

А это уже однозначно ошибка в проге. AllocMemSize изменяется самам дельфи в GetMem.inc при всяких GetMem/FreeMem


Digitman   (2004-08-06 11:06:00) [25]


> TUser ©   (06.08.04 10:47) [7]


куча - термин и механизм ОС
с каждым вновь стартующим процессом ОС по умолчанию ассоциирует одну индивидуальную кучу ... из этой кучи процесс вправе запрашивать блоки, которые ОС при успешном запросе отображает на страницы вирт.памяти АП процесса ... этим и занимается ВММ - получив от прикл.кода GetMem-запрос, он запрашивает из кучи одну или более страниц, структурируетих и уже из сформированных структур возвращает прикл.коду блок затребованной памяти ... когда прикл.код запрашивает у ВММ FreeMem, ВММ помечает в соотв.блок в своейструктуре как свободный, но не отдает в кучу ранее запрошенные страничные блоки, чтобы при последующих GetMem можно было в своих  структурах быстро найти подходящий блок, вновь пометить его как занятый и тут же вернуть прикл.коду ... тем самым достигается минимизация обращений к куче


Anatoly Podgoretsky   (2004-08-06 10:52:00) [26]

Тут надо понимать, что такое виртуальная память и что такое адресное простраство.
Не отдает, затем что может повторно ее использовать, а не запрашивать у менеджера памяти Виндоус. Но это никак не ограничивает (почти) другие приложения.


TUser   (2004-08-06 10:47:00) [27]

Да, про это я слышал. Мне просо не очень понятна вот эта фраза

и не отдает уже запрошенные страницы назад в кучу вплоть до завершения процесса из соображений повторного использования

Т.е. получается, что FreeMem низаче не нужен, т.к. память все равно не может быть использована повторно, так что ли? В общем - непонятно.


Anatoly Podgoretsky   (2004-08-06 10:33:00) [28]

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


TUser   (2004-08-06 10:30:00) [29]

Digitman ©   (06.08.04 09:58) [4]
Правильно ли я вас понял, что освобожденная память может быть повторно использована моей программой, но никакой другой (до завершения процесса)?


Digitman   (2004-08-06 09:58:00) [30]

менеджер памяти Борланда, используемый по умолчанию в операциях с памятью в приложении (явные или неявные Get/Realloc/FreeMem), при необходимости запрашивает память из кучи процесса, причем запрашивает в объеме кратном странице (4к) и не отдает уже запрошенные страницы назад в кучу вплоть до завершения процесса из соображений повторного использования

если куча "тает на глазах", то это означает одно - затребованный к выделению объем памяти в запросах к BMM со стороны приложения явно превышает объем освобождаемой памяти в запросах к тому же ВММ, что делает возможным предположение об ошибках в логике приложения, ведущих к утечкам памяти


arm79   (2004-08-06 09:37:00) [31]

AllocMemSize - тоже прирастает.


TUser   (2004-08-05 19:33:00) [32]


> высвобождаемое место при FreeMem повторно используется?
> Или виндовый диспетчер памяти не хочет увидеть кусочки такой
> памяти свободными? То есть я просто хочу знать, это моя
> прога однозначно виновата

Используется
Хочет
Однозначно

Вообще сочувствую - такие ошибки трудно находить, и на форуме обычно помочь ничем не могут - надо копать большое кол-во твоего кода. Только ты можешь исправить баг.


GuAV   (2004-08-05 19:24:00) [33]

System.AllocMemSize - внутренний счетчик памяти в Delphi


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо