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

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

Ответ на: "как я могу найти, какой процесс утечки памяти"

Количество ответов:7

Сложная задача. Я, как правило, предлагают захватить отладник / памяти профилировщик, как Valgrind and run the programs one after one in it. Soon or later you will find the program that leaks and can tell it the devloper or fix it yourself. и запустить программы один за другим в нем. Скоро или позже вы найдете программу, которая протекает и может сказать это devloper или исправить это самостоятельно.

Вы можете запустить команду top command (to run non-interactively, type (для запуска неинтерактивно, типа top -b -n 1). To see applications which are leaking memory, look at the following columns:). Чтобы увидеть приложения, которые протекают памяти, посмотрите на следующие колонки:

  • RPRVT - резидент частного адреса пространства размер
  • RSHRD - резидент общий адрес пространства размер
  • RSIZE - резидент размер памяти
  • VPRVT - частный адрес пространства размер
  • VS-S-S

Как suggeseted, путь valgrind. Это профайлер, который проверяет многие аспекты производительности работы приложения, включая использование памяти.

Запуск приложения через Valgrind позволит вам проверить, если вы забыли освободить память, выделенную с malloc, если вы освободите ту же память дважды и т.д.

В дополнение к верхней, вы можете использовать системный монитор (Система - Администрирование - Системный монитор, затем выберите вкладку процессов). Выберите Просмотр - Все процессы, перейдите к редактированию - Предпочтения и включите колонку виртуальной памяти. Сортировок либо по этой колонке, либо по столбцу памяти

, если программа протекает в течение длительного времени, топ не может быть практичным. Я хотел бы написать простой оболочки скриптов, что прилагает результат "ps Aux" в файл каждые X секунд, в зависимости от того, сколько времени требуется, чтобы утечка значительное количество памяти. Что-то вроде:

while true
do
echo "---------------------------------" >> /tmp/mem_usage
date >> /tmp/mem_usage
ps aux >> /tmp/mem_usage
sleep 60
done

Если вы не можете сделать это дедуктивно, рассмотрим шаблон отладки Сигнал Flare: Увеличьте количество памяти, выделенное одним процессом, в десять раз. Затем запустите программу.

Если количество утечки памяти то же самое, что процесс не был источником утечки; восстановить процесс и внести те же изменения в следующий процесс.

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

Я предлагаю использовать htop, как лучшая альтернатива началу.