Я використовую kill -3
команду, щоб побачити скидання потоку JVM в unix. Але де я можу знайти вихід цієї kill
команди? Я загубився!!
Я використовую kill -3
команду, щоб побачити скидання потоку JVM в unix. Але де я можу знайти вихід цієї kill
команди? Я загубився!!
Відповіді:
Ви також можете використовувати jstack (в комплекті з JDK), щоб взяти дамп потоку і написати результат, куди ви хочете. Це не доступно в середовищі Unix?
jstack PID > outfile
Дамп потоку записується в систему з VM, на якій ви виконали kill -3
. Якщо ви переспрямовуєте консольний вихід JVM у файл, дамп потоку буде у цьому файлі. Якщо JVM працює у відкритій консолі, то дамп потоку відображатиметься на його консолі.
Існує спосіб перенаправити вихідний дамп JVM-потоку на сигнал розриву, щоб відокремити файл з опцією діагностики LogVMOutput :
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
З Java 8 на зображенні jcmd
є кращим підходом.
jcmd <PID> Thread.print
Нижче наведено фрагмент документації Oracle :
Випуск JDK 8 представив Java Mission Control, Java Flight Recorder та утиліту jcmd для діагностики проблем із програмами JVM та Java. Пропонується використовувати останню утиліту, jcmd замість попередньої утиліти jstack для розширеної діагностики та зниження продуктивності.
Однак доставка цього додатка може мати наслідки ліцензування, в чому я не впевнений.
jcmd
не вдається підключитися до процесу обслуговування вікна з com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
поки jstack -F
досягає успіху: stackoverflow.com/questions/1197912 / ...
Під час використання kill -3 слід побачити дамп потоку на стандартному виході. Більшість серверів додатків записують стандартний висновок в окремий файл. Ви повинні знайти його там, коли використовуєте kill -3. Існує кілька способів отримання відвалів потоку:
kill -3 <PID>
: Дає вихід на стандартний вихід.Для віртуальних точок доступу, ми також можемо використовувати 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>
повинен вбивати JVM. Який тип програми Java ви переглядаєте?
Кроки, які ви повинні виконати, якщо ви хочете скинути нитку вашого 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