реклама на сайте
подробности

 
 
> Делфи 5. Утечка памяти.
GetSmart
сообщение Jan 23 2012, 16:03
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Есть проект на Делфи 5. Работает сутки и более. В процессе работы вижу в диспетчере задач, что память процесса растёт на 100-200-300 МБ. За сутки может 300 отъесть. Но в алгоритме там реально памяти требуется всего 20-40 МБ. Однако там сотни тысяч-миллионы раз происходит работа со строками (от 1 до 100000 символов длиной). Это единственное подозрение на утечку.

Я правильно понимаю, что если я в процедуре создал строку, то на выходе из этой процедуры Делфа должна сама освобождать указатель строки? И аналогично, если я заполненной строке присваиваю новое значение, то делфа должна сама старую строку удалить из динамической памяти? Или это должен делать программист сам?

Сообщение отредактировал GetSmart - Jan 23 2012, 23:36


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Jan 23 2012, 16:19
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А работа с памятью через New/Dispose или GetMem/FreeMem используется? Плагины? Интерфейсы? COM/OLE?
Если нет, то скорее всего всё нормально. Просто происходит фрагментация кучи, и при очередном распределении большой строки для неё не находится свободного непрерывного места, и приходится выделять новый кусок. После достижения какого-то размера этот процесс устаканится, и рост памяти прекратится.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 23 2012, 16:27
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(AHTOXA @ Jan 23 2012, 21:19) *
А работа с памятью через New/Dispose или GetMem/FreeMem используется?

Это есть при запуске. Как раз выделяются 20-40 МБ. Далее, буквально раз в 5 минут выделяется по 10-100 байт через GetMem(). За сутки GetMem() может выделить от силы мегабайт, скорее в 10 раз меньше.

Цитата
Плагины? Интерфейсы? COM/OLE?

Только класс TNMHTTP.

Цитата
Если нет, то скорее всего всё нормально. Просто происходит фрагментация кучи, и при очередном распределении большой строки для неё не находится свободного непрерывного места, и приходится выделять новый кусок.

На 99% не верю. Но хотелось бы как-то проверить это дело. Что показательно, так это то, что выделяемые каждый раз строки полностью удаляются (должны). Фактически строк, которые живут долго и создают фрагментацию я не имею. Хотя... Есть такая штука Memo, в которую медленно добавляется текст и через сутки его объём доходит до 30-200 КБ. Могу добавлять этот текст не в Memo, а в файл, для проверки версии.
Могу даже полностью убрать вызовы GetMem() в процессе работы, выделив мегабайт заранее и потом внутри него линейно выделять куски.
Но хотелось бы не делать лишней работы, и узнать заранее что надо, а что не надо.

Цитата(AHTOXA @ Jan 23 2012, 21:19) *
После достижения какого-то размера этот процесс устаканится, и рост памяти прекратится.

Не заметил. Стабильно растёт. Тем более, если уже теряется в 10 раз больше, чем необходимо, то это реальный беспредел.

Сообщение отредактировал GetSmart - Jan 23 2012, 16:52


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 23 2012, 17:03
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(GetSmart @ Jan 23 2012, 22:27) *
Только класс TNMHTTP.

Ни о чём не говоритsm.gif Но это вроде как что-то из поставки дельфи? Тогда явные ляпы маловероятны.
Цитата
На 99% не верю. Но хотелось бы как-то проверить это дело. Что показательно, так это то, что выделяемые каждый раз строки полностью удаляются (должны).

Не верите во что? Строки в дельфи - очень надёжная штука. Мой опыт это подтверждает. У меня есть приложения, которые работают месяцами, при очень активном использовании строк. Так что думаю, что дело не в них.
Цитата
Не заметил. Стабильно растёт. Тем более, если уже теряется в 10 раз больше, чем необходимо, то это реальный беспредел.

Если есть возможность, то распределяйте/освобождайте память через свою спецфункцию, со счётчиком. То же и со строками. Метод простой и очень эффективный.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 23 2012, 17:14
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(AHTOXA @ Jan 23 2012, 22:03) *
Не верите во что? Строки в дельфи - очень надёжная штука.

Там было о фрагментации написано, а не о строках.

Цитата(AHTOXA @ Jan 23 2012, 22:03) *
Если есть возможность, то распределяйте/освобождайте память через свою спецфункцию, со счётчиком. То же и со строками. Метод простой и очень эффективный.

Со строками тот ещё гемор. Тыщи строк кода переписывать и делать через жпу, если я правильно понял. Потому как выражения типа Memo2.Lines.Add(s1+s2) придётся в 10 строк переписывать.

Свой GetMem() писать тоже занятие тяжкое и долгое. Если конечно делать качественно, без потерь памяти.

Цитата(_Pasha)
memavail() и maxavail() выведите в отдельный тред и вызывайте / логьте через какой-то промежуток времени. Если фрагментация - станет ясно через часок.

Не пойму, чем эта статистика лучше чем из диспетчера задач?

Сообщение отредактировал GetSmart - Jan 24 2012, 15:39


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 24 2012, 07:43
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(GetSmart @ Jan 23 2012, 21:14) *
Не пойму, чем эта статистика лучше чем из диспетчера задач?

Хоть уже и не актуально, но :
мы тогда говорили о фрагментации кучи, я предлагал таким образом установить именно факт утечки памяти из-за фрагментации.
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Jan 24 2012, 10:04
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Везде, где есть New, GetMem или Create - увеличивать глобальный счётчик и писать в лог, где Dispose, FreeMem или Free - счётчик уменьшать и тоже писать в лог. Хорошо помогает (мне, во всяком случае), а на строки в Дельфе можно не пенять (как уже заметили).
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 00:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016