Рост объема процесса в многопоточном приложении

125
12

Мне нужно какое-то решение, чтобы выяснить проблему. Новый и удалить в разных потоках в моем приложении после обработки большего количества запросов, размер процесса растет и не уменьшается.

Код Psudo:

Main () {
Thread1 enter
Creating object and inserting into map.
Thread1 exit

Thread2 enter
Itherating to the map and creating child thread based on the no of object in the map.
Thread2 exit

Child thread calling the function at the end deleting the object.
}

Объект, созданный в Thread1, удаленный в дочернем потоке, созданный с использованием Thread2.

Является ли вышеуказанный одобрительный метод в порядке. Я совершаю ошибки. Потому что, когда количество объектов увеличилось на карте. Размер процесса быстро растет даже после удаления всего выделенного объекта и очистки карты. Может ли кто-нибудь сказать мне, что может быть причиной роста размера процесса.
Обновить:

Было обновление. Я проверил процесс с помощью инструмента libumem, который является детектором течи. Показывает ничего.

Когда входящий трафик и скорость удаления равны размеру процесса, не растущему. Размер процесса увеличивается только при интенсивном движении. Пример: скорость входящего трафика - 4000, а скорость удаления - 100. Размер процесса увеличивается. После того как весь обработанный и удаленный запрос ожидает, что размер процесса вернется в нормальное состояние, но не вернется к нормальному состоянию. Еще одно наблюдение - это первый раз, когда я отправляю запрос 10k. Память не увеличивается. Затем я снова отправляю запрос 10k на этот раз, размер процесса не увеличивается. Увеличенная память на 1-й итерации была повторно использована. Связано ли это с поведением ОС?

спросил(а) 2021-01-25T18:03:06+03:00 4 месяца, 4 недели назад
1
Решение
77

Так стандартная библиотека управляет памятью. Приобретение памяти из системы довольно дорогое, поэтому она не возвращается в систему сразу, так как есть большой шанс, что она понадобится снова в ближайшее время.

Нитки также не удаляются сразу, так как их создание - дорогостоящий процесс. Поэтому, когда std::thread выполняется, фактический поток просто перемещается в пул потоков, который будет использоваться повторно в будущем.

Это стандартное поведение библиотеки довольно широкое и сложное.

Но если ваши программы постоянно растут (не останавливайтесь на каком-то уровне), тогда у вас должна быть утечка памяти в вашем приложении. В этом случае я рекомендую использовать некоторые инструменты для обнаружения утечек памяти, например, дезинфицирующее средство для clang-адреса отлично.

ответил(а) 2021-01-25T18:03:06+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема