Подтвердить что ты не робот

Как я могу найти, какой процесс утечка памяти

У меня есть система (Ubuntu) со многими процессами и одна (или более) имеет утечку памяти. Есть ли хороший способ найти процесс, который имеет утечку? Некоторые из процессов - JVM, некоторые - нет. Некоторые из них являются родными, некоторые из которых являются открытыми.

4b9b3361

Ответ 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, как лучшую альтернативу вершине.