вбити -3, щоб отримати скидання Java-нитки


116

Я використовую kill -3команду, щоб побачити скидання потоку JVM в unix. Але де я можу знайти вихід цієї killкоманди? Я загубився!!


Який процес ти вбиваєш? Це сервер додатків J2EE? Якщо це так, ви повинні знайти слід стека в стандартному.
Luciano Fiandesio

Я вбиваю процес, який запускає клас java
javanerd

2
Не слід писати дамп нитки на консолі. оскільки клас java має консоль як std out
javanerd

Відповіді:


194

Ви також можете використовувати jstack (в комплекті з JDK), щоб взяти дамп потоку і написати результат, куди ви хочете. Це не доступно в середовищі Unix?

jstack PID > outfile

1
Так - у той момент часу, коли воно виконується. Ви також можете вказати -l (малий регістр L) для довгого списку, який друкує додаткову інформацію про блокування
Джошуа МакКіннон

2
Доки команда jstack не виходить з ладу послідовно через "Неможливо вивести тип потоку з адреси"
;-(

1
Якщо ви бачите цю помилку, пропоную скористатися її постачальником. Швидкий пошук показує, наприклад, у RHEL відкрита помилка щодо цієї помилки та openjdk ...
Джошуа МакКіннон

7
Варто зазначити, що jstack вимагає JDK. Якщо ви запускаєте програми на сервері, на якому встановлено лише JRE, вам потрібно буде знайти інший засіб для скидання потоку.
jeffkempf

1
Ось як використовувати jstack для отримання дампа потоків процесу працює під іншим користувачем, як вікна обслуговування: stackoverflow.com/questions/1197912 / ...
Vadzim

44

Дамп потоку записується в систему з VM, на якій ви виконали kill -3. Якщо ви переспрямовуєте консольний вихід JVM у файл, дамп потоку буде у цьому файлі. Якщо JVM працює у відкритій консолі, то дамп потоку відображатиметься на його консолі.


1
Існує спосіб перенаправити вихідний дамп JVM-потоку на окремий файл. Дивіться у моїй відповіді.
Вадим

32

Існує спосіб перенаправити вихідний дамп JVM-потоку на сигнал розриву, щоб відокремити файл з опцією діагностики LogVMOutput :

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log

5
Технічно це не "перенаправляє" вихідний дамп-потік. Він вмикає JVM вхід у jvm.log (який включає вихід дампного потоку), але kill -QUIT все одно буде скидатися на stdout процесу (aswell). Запропоновано для опису незрозумілих варіантів JVM :)
sqweek

25

З Java 8 на зображенні jcmdє кращим підходом.

jcmd <PID> Thread.print

Нижче наведено фрагмент документації Oracle :

Випуск JDK 8 представив Java Mission Control, Java Flight Recorder та утиліту jcmd для діагностики проблем із програмами JVM та Java. Пропонується використовувати останню утиліту, jcmd замість попередньої утиліти jstack для розширеної діагностики та зниження продуктивності.

Однак доставка цього додатка може мати наслідки ліцензування, в чому я не впевнений.


1
На жаль , jcmdне вдається підключитися до процесу обслуговування вікна з com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attachпоки jstack -Fдосягає успіху: stackoverflow.com/questions/1197912 / ...
Вадима

1
Потрібно запустити jcmd <pid> Thread.dump під тим самим користувачем, що й у процесі java, інакше ваші з'єднання будуть припинені. Дивіться stackoverflow.com/questions/25438983/…
Twilite

11

У тому самому місці, де розміщено виступ JVM. Якщо у вас є сервер Tomcat, це буде catalina_(date).outфайл.


8

Під час використання kill -3 слід побачити дамп потоку на стандартному виході. Більшість серверів додатків записують стандартний висновок в окремий файл. Ви повинні знайти його там, коли використовуєте kill -3. Існує кілька способів отримання відвалів потоку:

  • kill -3 <PID>: Дає вихід на стандартний вихід.
  • Якщо у вас є доступ до вікна консолі, де працює сервер, можна використовувати Ctrl+ Breakкомбінацію клавіш для генерування сліду стека на STDOUT.
  • Для віртуальних точок доступу, ми також можемо використовувати jstackкоманду для створення дампа потоку. Це частина JDK. Синтаксис такий:

    Usage:
    
    jstack [-l] <pid> (to connect to running process)
    jstack -F [-m] [-l] <pid>(to connect to a hung process)
    
     - For JRockit JVM we can use JRCMD command which comes with JDK Syntax: 
       jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]

У мене виникають проблеми з використанням Kill -3 <PID>. Це працює нормально, але вбиває процес також після написання дампа нитки до консолі. Чи варто це робити?
Ешлі

@Ashley - ніхто не kill -3 <PID>повинен вбивати JVM. Який тип програми Java ви переглядаєте?
slm

2

У Jboss ви можете виконати наступне

nohup $JBOSS_HOME/bin/run.sh -c  yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out  2>&1 < /dev/null &
kill -3 <java_pid>

Це перенаправить ваш вихід / потоковий потік на консоль файлу, вказану у вищевказаній команді.



2

Кроки, які ви повинні виконати, якщо ви хочете скинути нитку вашого StandAlone Java Process

Крок 1. Отримайте ідентифікатор процесу для сценарію оболонки, що викликає програму java

linux$ ps -aef | grep "runABCD"

user1  **8535**  4369   0   Mar 25 ?           0:00 /bin/csh /home/user1/runABCD.sh

user1 17796 17372   0 08:15:41 pts/49      0:00 grep runABCD

Крок 2: Отримайте ідентифікатор процесу для дитини, на який був викликаний runABCD. Скористайтеся вищевказаним ПІД, щоб отримати дітей.

linux$ ps -aef | grep **8535**

user1  **8536**  8535   0   Mar 25 ?         126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer

user1  8535  4369   0   Mar 25 ?           0:00 /bin/csh /home/user1/runABCD.sh

user1 17977 17372   0 08:15:49 pts/49      0:00 grep 8535

Крок 3: Отримайте JSTACK для конкретного процесу. Отримайте ідентифікатор процесу вашого XYSServer процесу. тобто 8536

linux$ jstack **8536** > threadDump.log
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.