У меня есть система (Ubuntu) со многими процессами и одна (или более) имеет утечку памяти. Есть ли хороший способ найти процесс, который имеет утечку? Некоторые из процессов - JVM, некоторые - нет. Некоторые из них являются родными, некоторые из которых являются открытыми.
Как я могу найти, какой процесс утечка памяти
Ответ 1
Вы можете запустить команду top
(для запуска не интерактивно, введите top -b -n 1
). Чтобы увидеть приложения, которые вызывают утечку памяти, просмотрите следующие столбцы:
- RPRVT - размер локального адресного пространства резидента.
- RSHRD - размер общего адресного пространства резиденции
- RSIZE - размер резидентной памяти
- VPRVT - размер частного адресного пространства
- VSIZE - общий объем памяти
Ответ 2
Если программа протекает в течение длительного времени, верхняя часть может оказаться непрактичной. Я бы написал простые сценарии оболочки, которые добавили результат "ps aux" в файл каждые X секунд, в зависимости от того, сколько времени потребуется для утечки значительных объемов памяти. Что-то вроде:
while true
do
echo "---------------------------------" >> /tmp/mem_usage
date >> /tmp/mem_usage
ps aux >> /tmp/mem_usage
sleep 60
done
Ответ 3
Кроме того, вы можете использовать System Monitor (System - Administration - System Monitor, затем вкладку Processes). Выберите "Просмотр - все процессы", перейдите в "Редактировать - настройки" и включите столбец "Виртуальная память". Сортировка по этому столбцу или столбцу "Память"
Ответ 4
Сложная задача. Обычно я предлагаю захватить профайлер отладчика/памяти, например Valgrind и запускать программы один за другим в нем. Вскоре или позже вы найдете программу, которая просачивается, и может сказать ей devloper или исправить ее самостоятельно.
Ответ 5
Как и было сказано, путь - это valgrind. Это профилировщик, который проверяет многие аспекты производительности вашего приложения, включая использование памяти.
Запуск приложения через Valgrind позволит вам проверить, если вы забудете освободить память, выделенную с помощью malloc, если вы освободите одну и ту же память дважды и т.д.
Ответ 6
Если вы не можете сделать это дедуктивно, рассмотрите шаблон отладки сигнала: Увеличьте объем памяти, выделяемый одним процессом, в десять раз. Затем запустите свою программу.
Если количество утечки памяти совпадает, этот процесс не был источником утечки; восстановить процесс и внести изменения в следующий процесс.
Когда вы нажмете на ответственный процесс, вы увидите размер скачка утечки памяти ( "сигнальная вспышка" ). Вы можете сузить его еще дальше, выборочно увеличивая размер выделения отдельных операторов в этом процессе.
Ответ 7
Я предлагаю использовать htop, как лучшую альтернативу вершине.