Есть сетевое приложение основанное на qt + boost asio
под ос linux 64 bit
. При запуске размер занимаемой оперативной памяти составляет порядка 20Mb, но в процессе работы на каждый создаваемый сокет программа вырастает в среднем немного менее чем на 1Mb, и итоге с 300-ми активными соединениями объем занимаемой памяти достигает ~250Mb.
sizeof
самого дочернего класса соединения в иерархии не превышает 10кб. Объект сокета особо не содержит каких либо больших объемов данных.
В приложении всего 7 потоков, 6 из них обработчики boost::io_service
.
Такого же не должно быть? В чем может быть причина такого большого потребления памяти?
sizeof
не показатель реального размера памяти, который необходим для работы объекта. sizeof
покажет лишь общее кол-во байт, выделенных на стеке при размещении объекта на том же стеке. Если в процессе работы производится динамическое выделение памяти через new
, то этот размер не отразится в sizeof
, но вполне будет заметен при просмотре через менеджер памяти ОС.
Пример:
struct S
{
S() : p(new int[10000]) {}
int* p;
};
sizeof(S)
даст размер указателя (8 или 4 байта) в зависимости от разрядности ОС. Но эффективный размер объекта типа S
будет существенно больше, т.к. в конструкторе выделяется ещё массив в куче.
Использование профилировщика показало что большую часть памяти в куче выделяет CRYPTO_malloc и CRYPTO_realloc. Теперь есть над чем подумать...
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Что нужно изменить, или возможно хукнуть (перехватить) для изменения правила деления? В моих задачах при делении числа на 0 должен получаться...
У меня есть кнопка button_one и слот Paint_orb который по сигналу Clicked делает вот что :