Можно отправить сигнал SIGQUIT в рабочую JVM для получения stacktraces каждого потока, распечатанного к stdout. Это не уничтожает процесс, хотя я думаю, что он действительно помещает все потоки для сна, в то время как отслеживания стека печатаются.
Затем коррелируйте идентификаторы потока, перечисленные с Вашим предпочтительным методом наблюдения мудрой потоком загрузки ЦП. prstat -L
для Соляриса, top -H
для Linux. Обратите внимание, что tid's в отслеживаниях стека Java печатается в шестнадцатеричном; необходимо будет, вероятно, преобразовать в десятичное число когда по сравнению с выводом prstat или вершиной.
Я делаю дамп потока. Однако в моих Производственных системах это не может быть сделано, если JVM не запускается с определенных параметров, которые мы никогда не включали бы в Производстве. В этом случае я использую jboss.system:type=ServerInfo mbean консоли JMX, чтобы сделать дамп потока (listThreadDump ()).
Вывод дампа потока главным образом бессмыслен мне, когда я не написал код. Но человек, который написал код, может понимать его. В этих случаях, где дампы потока не помогают, я предпочитаю использовать"strace -fp <PID of JBoss' java process> -o outfile.txt
"чтобы иметь другое представление в то, что происходит на уровне системного вызова. Это немного похоже на питье от пожарного шланга, но иногда это помогает.
top -Hp <java_PID>
, и затем после нахождения PIO потока работают strace -fp <thread_pid> -o outfile.txt
– Mircea Vutcovici
16 March 2010 в 01:52