Как устранить неполадки не отвечающего Java-приложения / процесса в Linux - PullRequest
3 голосов
/ 04 мая 2009

Скажите, что ваше приложение не отвечает, и вы не можете подключить к нему отладчик, поскольку он отклоняет все. Все, что у вас есть, это Linux Bash и идентификатор процесса. Как бы вы расследовали проблему? Какие инструменты вы бы использовали? Моя цель - улучшить навыки устранения неполадок с помощью Java.

Эта конкретная проблема у нас была в производстве, на сайте заказчика.

Ответы [ 6 ]

4 голосов
/ 04 мая 2009

Вы можете получить дамп потока из приложения, набрав:

kill -3 

Это даст вам некоторую информацию о текущем состоянии потоков и, надеюсь, поможет диагностировать проблему. Однако хитрость заключается не в том, чтобы получить дамп потока, а в том, чтобы прочитать созданный дамп потока, поскольку их может показаться немного ошеломляющим. Смотрите эту ссылку для получения дополнительной информации о чтении дампа потока.

http://manikandakumar.blogspot.com/2006/12/reading-thread-dumps.html

Вы также можете взглянуть на jstack, который является частью JDK - я не использовал его специально, см .:

http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstack.html

1 голос
/ 04 мая 2009

Я согласен с Джоном, что вы должны использовать kill -3, чтобы получить дамп потока. Я нашел Анализатор дампов , полезный для просмотра дампов потоков.

Вы также должны взглянуть на использование памяти процессом, используя top. Похоже, приложение исчерпало кучу места? Если это так, вы можете попробовать использовать инструмент jmap , чтобы получить дамп кучи и / или количество гистограмм объектов в куче. Вам может понадобиться использовать опцию -F, если приложение действительно зависло, и у меня были случаи, когда jmap просто не работал бы с зависшим процессом Java. Получив дамп кучи, вы можете использовать Eclipse Memory Analyzer для его исследования.

Вы не упоминаете, есть ли в вашем приложении логирование. Если нет, вы должны изучить возможность добавления журналов, которые могли бы помочь отладить производственные проблемы.

0 голосов
/ 04 мая 2009

Я согласен с другими, что дампы потоков - это путь. Я хотел бы добавить, что вы должны получить множество дампов потоков. Вы можете сделать очень простое профилирование всего несколькими командами Unix. Проверьте мой пост здесь

0 голосов
/ 04 мая 2009

Если у вас есть Java 6, вы можете попытаться соединиться с Visualvm (https://visualvm.dev.java.net/), который поставляется с текущими JDK для подключения к виртуальной машине. С помощью этого инструмента вы можете создать полный MemoryDump (не только дамп потока) вашей виртуальной машины. Вы можете загрузить этот дамп памяти в VisualVM или Eclipse с помощью плагина MAT (Инструменты анализа памяти http://www.eclipse.org/mat/).

После некоторого времени загрузки вычислений вы можете просмотреть полную кучу своего приложения, форму поиска утечек памяти и т. Д.

Анализ дампа кучи - это отличный способ улучшить свои навыки по устранению неисправностей.

0 голосов
/ 04 мая 2009

Похоже на вопрос интервью. Вы также можете попробовать подключить jconsole, чтобы посмотреть, что он делает.

0 голосов
/ 04 мая 2009
jstack <pid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...