Есть сетевое приложение основанное на 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. Теперь есть над чем подумать...
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости