Я столкнулся со следующей проблемой с моим кодом: я использовал Valgrind и gperftools для выполнения проверки кучи и профилирования кучи, чтобы посмотреть, освобожу ли я всю память, которую я выделяю. Выход этих инструментов выглядит хорошо, и кажется, что я не теряю память. Однако, когда я смотрю top
и вывод ps
, я запутался, потому что это в основном не отражает то, что я наблюдаю с valgrind и gperftools.
Вот цифры:
- Лучшие отчеты: RES 150M
- Отчеты Valgrind (Massif): пиковое использование 23M
- Отчеты gipftools Heap Profiler: пиковое использование 22.7M
Мой вопрос теперь, откуда эта разница? Я также попытался отслеживать использование стека в Valgrind, но без каких-либо успехов.
Дополнительная информация:
- Процесс в основном загружает данные из mysql через C api в хранилище в памяти.
- Выполнение проверки утечки и прерывания сразу после завершения загрузки показывает окончательное потеряние в 144 байта и достижимое 10M, которое соответствует сумме, которая в настоящее время выделена.
- Библиотека не выполняет сложный IPC, она запускает несколько потоков, но только один из потоков выполняет работу.
- Он не загружает другие сложные системные библиотеки.
- размер PSS из /proc/pid/smaps соответствует размеру RES в TOP и ps
Есть ли у вас какие-либо идеи, откуда эта разница в потреблении памяти? Как я могу подтвердить, что моя программа ведет себя правильно? Есть ли у вас какие-либо идеи, как я мог бы продолжить исследование этой проблемы?