|
Делфи 5. Утечка памяти. |
|
|
|
 |
Ответов
|
Jan 23 2012, 16:27
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 23 2012, 17:03
|

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

|
Цитата(GetSmart @ Jan 23 2012, 22:27)  Только класс TNMHTTP. Ни о чём не говорит  Но это вроде как что-то из поставки дельфи? Тогда явные ляпы маловероятны. Цитата На 99% не верю. Но хотелось бы как-то проверить это дело. Что показательно, так это то, что выделяемые каждый раз строки полностью удаляются (должны). Не верите во что? Строки в дельфи - очень надёжная штука. Мой опыт это подтверждает. У меня есть приложения, которые работают месяцами, при очень активном использовании строк. Так что думаю, что дело не в них. Цитата Не заметил. Стабильно растёт. Тем более, если уже теряется в 10 раз больше, чем необходимо, то это реальный беспредел. Если есть возможность, то распределяйте/освобождайте память через свою спецфункцию, со счётчиком. То же и со строками. Метод простой и очень эффективный.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 23 2012, 17:14
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|