Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Постоянный рост занимаемой памяти приложением  (Прочитано 1503 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3037
    • Просмотр профиля
Если объём занимаемой памяти растёт во время выполнения, то, возможно, это баг системы и она не забирает память,
которую программа пытается ей вернуть. Поэтому надо по возможности избегать частых выделений памяти. Если это
происходит внутри подпрограмм непосредственно или в создаваемых в ней объектах классов, то с этим трудно
бороться, а в главной программе надо при её запуске выделить память подо все её элементы один раз и больше
не использовать пар отведения/освобождения памяти. Чтобы этого не делать в подпрограммах, т.е. чтобы они
не отводили память для своих внутренних нужд, которую потом освобождают, можно и им передавать адрес буфера,
специально предназначенного для этого в главной программе.
Ещё я в главной программе по одному разу отвожу память для всех элементов одного типа - int, char и других,
а затем по ней размещаю указатели, вместо того, чтобы для каждого массива отводить память отдельно.
Пётр.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Если объём занимаемой памяти растёт во время выполнения, то, возможно, это баг системы и она не забирает память,
которую программа пытается ей вернуть.
Ничего себе баг. Если это баг системы, то о какой работе может идти речь?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн @rch1tect0r

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Ух... проблемы точно где-то в общей логике появляются. И в том, что я очень активно выделяю память и в какой-то момент также активно освобождаю её.

Сейчас улучшил один из механизмов который подготавливает данные для передачи по сети. За 14 часов полёт нормальный. Вернул в программу блок который выполняет malloc_trim в определённый момент времени. Видно, что приложение отпускает память и потом начинает её добирать в зависимости от своих нужд. Везде где позволяет логика добавил передачу данных по ссылкам(в связи с последними изменениями таких мест стало больше).
Пока что я не вижу такого роста занимаемой памяти как наблюдался ранее. Надеюсь, что такой неадекватный рост используемых ресурсов прекратится.

Я вернулся к своему велосипеду, который использовал для переноса данных из одного std::list в другой, т.к. вариант который используется в stl приводит к тому, что при использовании процедур типа splice или insert либо один из листов становится невалидным для дальнейшего использования(что приводит к некорректному поведению, которое не было сразу обнаружено), либо stl создаёт дополнительный буферный список такого же размера как оригинальный, что требует достаточно много места в оперативной памяти. В общем надо быть внимательным даже при использовании stl функций  :-[

 

Страница сгенерирована за 0.067 секунд. Запросов: 25.