2016-04-18 7 views
6

Я хочу сгенерировать поток дампа через java-код, я пробовал использовать ThreadMXBean для этого, но я не получаю дамп потока в правильном формате, поскольку мы получаем с помощью jstack. Пожалуйста, может ли один предоставить некоторым help..is их любым другим способом, чтобы получить нить дамп ... с использованием любого другого API .. Формат потока отвала, что я хочу -Как записывать дамп потока программным образом с использованием кода JAVA?

2015-08-06 05:51:15 
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode): 

"Attach Listener" daemon prio=10 tid=0x00007fdab805d800 nid=0x7a36 waiting on condition [0x0000000000000000] 


java.lang.Thread.State: RUNNABLE 

"ajp-mco/127.168.121.120:8170-220" daemon prio=10 tid=0x00007fdaa056d000 nid=0x7961 runnable [0x00007fda8bb7a000] 


java.lang.Thread.State: RUNNABLE 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(SocketInputStream.java:152) 
at java.net.SocketInputStream.read(SocketInputStream.java:122) 
at org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:1114) 
at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:1196) 
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:436) 
at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:420) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920) 
at java.lang.Thread.run(Thread.java:744) 
+0

Я считаю, что 'jstack' сам использует' ThreadMXBean', чтобы получить эту информацию. По общему признанию, это отличается от дампа потока, который получает при отправке 'kill -3' в процесс. –

+0

да, но когда я использую ThreadMXBean, я не получаю полную информацию, такую ​​как tid, nid, thread is daemon или нет ... эти данные я не могу пройти через threadMXBean. –

+0

К сожалению, я не думаю, что java предоставляет способ получить эти дополнительные данные. – jtahlborn

ответ

2

Вы можете использовать, чтобы получить Thread.getAllStackTraces() большинство из этого.

for (Map.Entry<Thread, StackTraceElement[]> entry : Thread.getAllStackTraces().entrySet()) { 
    System.out.println(entry.getKey() + " " + entry.getKey().getState()); 
    for (StackTraceElement ste : entry.getValue()) { 
     System.out.println("\tat " + ste); 
    } 
    System.out.println(); 
} 
+0

Использование этого также не получает полную информацию, например, tid, nid, thread is daemon или нет ... –

+0

@RishiArora Ключ в «Карте» является объектом «Thread». Он раскрывает эти вещи. Что такое 'nid'? – Savior

+0

@RishiArora Я не уверен, что такое 'tid' или для чего он используется, nid' является идентификатором процесса в hexidecimal. Вы можете получить это с помощью JNA, но я не уверен, что вам это нужно. Вы можете получить 'Thread.isDaemon()' –

4

Попробуйте ManagementFactory.getThreadMXBean().dumpAllThreads(true, true) использовать что-то вроде

ThreadMXBean bean = ManagementFactory.getThreadMXBean(); 
ThreadInfo[] infos = bean.dumpAllThreads(true, true); 
for (ThreadInfo info : infos) { 
    System.out.println(info); 
} 

В качестве альтернативы вы можете взломать ваш путь вокруг и на самом деле назвать jstack через Runtime.getRuntime.exec():

String pid = ManagementFactory.getRuntimeMXBean().getName().replaceAll("[^\\d.]", ""); 
InputStream in = Runtime.getRuntime().exec(PATH_TO_JSTACK + " " + pid).getInputStream(); 
System.out.println(IOUtils.toString(InputStream)); 

Вот вывод для примера программы с использованием

44444507 +74256196550627766408888:

"pool-1-thread-4" Id=14 WAITING on java.u[email protected]2d98a335 
    at sun.misc.Unsafe.park(Native Method) 
    - waiting on java.u[email protected]2d98a335 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 


"pool-1-thread-3" Id=13 WAITING on java.u[email protected]2d98a335 
    at sun.misc.Unsafe.park(Native Method) 
    - waiting on java.u[email protected]2d98a335 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 


"pool-1-thread-2" Id=12 WAITING on java.u[email protected]2d98a335 
    at sun.misc.Unsafe.park(Native Method) 
    - waiting on java.u[email protected]2d98a335 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 


"pool-1-thread-1" Id=11 WAITING on java.u[email protected]2d98a335 
    at sun.misc.Unsafe.park(Native Method) 
    - waiting on java.u[email protected]2d98a335 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 


"Monitor Ctrl-Break" Id=10 RUNNABLE (in native) 
    at java.net.DualStackPlainSocketImpl.accept0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:131) 
    at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409) 
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:199) 
    - locked [email protected] 
    at java.net.ServerSocket.implAccept(ServerSocket.java:545) 
    at java.net.ServerSocket.accept(ServerSocket.java:513) 
    at com.intellij.rt.execution.application.AppMain$1.run(AppMain.java:90) 
    at java.lang.Thread.run(Thread.java:745) 


"Attach Listener" Id=5 RUNNABLE 


"Signal Dispatcher" Id=4 RUNNABLE 


"Finalizer" Id=3 WAITING on [email protected] 
    at java.lang.Object.wait(Native Method) 
    - waiting on [email protected] 
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143) 
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164) 
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209) 


"Reference Handler" Id=2 WAITING on [email protected] 
    at java.lang.Object.wait(Native Method) 
    - waiting on [email protected] 
    at java.lang.Object.wait(Object.java:502) 
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157) 


"main" Id=1 RUNNABLE 
    at sun.management.ThreadImpl.dumpThreads0(Native Method) 
    at sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:446) 
    at Playground.main(Playground.java:25) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

jstack (Копание консоли или через Runtime.getRuntime().exec()):

Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.65-b01 mixed mode): 

"DestroyJavaVM" #15 prio=5 os_prio=0 tid=0x00000000008bd800 nid=0x41c waiting on condition [0x0000000000000000] 
    java.lang.Thread.State: RUNNABLE 

"pool-1-thread-4" #14 prio=5 os_prio=0 tid=0x0000000016660800 nid=0x166c waiting on condition [0x0000000016dff000] 
    java.lang.Thread.State: WAITING (parking) 
     at sun.misc.Unsafe.park(Native Method) 
     - parking to wait for <0x00000000eb360088> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
     at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
     at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 

"pool-1-thread-3" #13 prio=5 os_prio=0 tid=0x0000000016660000 nid=0x1e34 waiting on condition [0x0000000016cff000] 
    java.lang.Thread.State: WAITING (parking) 
     at sun.misc.Unsafe.park(Native Method) 
     - parking to wait for <0x00000000eb360088> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
     at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
     at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 

"pool-1-thread-2" #12 prio=5 os_prio=0 tid=0x000000001665f000 nid=0x148 waiting on condition [0x0000000016bff000] 
    java.lang.Thread.State: WAITING (parking) 
     at sun.misc.Unsafe.park(Native Method) 
     - parking to wait for <0x00000000eb360088> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
     at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
     at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 

"pool-1-thread-1" #11 prio=5 os_prio=0 tid=0x000000001665b800 nid=0xdf0 waiting on condition [0x0000000016afe000] 
    java.lang.Thread.State: WAITING (parking) 
     at sun.misc.Unsafe.park(Native Method) 
     - parking to wait for <0x00000000eb360088> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
     at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
     at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 

"Monitor Ctrl-Break" #10 daemon prio=5 os_prio=0 tid=0x000000001641d000 nid=0x2038 runnable [0x00000000169fe000] 
    java.lang.Thread.State: RUNNABLE 
     at java.net.DualStackPlainSocketImpl.accept0(Native Method) 
     at java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:131) 
     at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409) 
     at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:199) 
     - locked <0x00000000eb39db18> (a java.net.SocksSocketImpl) 
     at java.net.ServerSocket.implAccept(ServerSocket.java:545) 
     at java.net.ServerSocket.accept(ServerSocket.java:513) 
     at com.intellij.rt.execution.application.AppMain$1.run(AppMain.java:90) 
     at java.lang.Thread.run(Thread.java:745) 

"Service Thread" #9 daemon prio=9 os_prio=0 tid=0x0000000014a1e000 nid=0x360 runnable [0x0000000000000000] 
    java.lang.Thread.State: RUNNABLE 

"C1 CompilerThread2" #8 daemon prio=9 os_prio=2 tid=0x00000000149c3800 nid=0x89c waiting on condition [0x0000000000000000] 
    java.lang.Thread.State: RUNNABLE 

"C2 CompilerThread1" #7 daemon prio=9 os_prio=2 tid=0x00000000149c0800 nid=0x2048 waiting on condition [0x0000000000000000] 
    java.lang.Thread.State: RUNNABLE 

"C2 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x00000000149bd800 nid=0x1aa0 waiting on condition [0x0000000000000000] 
    java.lang.Thread.State: RUNNABLE 

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x00000000149bc000 nid=0x108c waiting on condition [0x0000000000000000] 
    java.lang.Thread.State: RUNNABLE 

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x00000000149bb000 nid=0x15a4 runnable [0x0000000000000000] 
    java.lang.Thread.State: RUNNABLE 

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x00000000023b1000 nid=0x182c in Object.wait() [0x0000000015d1e000] 
    java.lang.Thread.State: WAITING (on object monitor) 
     at java.lang.Object.wait(Native Method) 
     - waiting on <0x00000000eb2070b8> (a java.lang.ref.ReferenceQueue$Lock) 
     at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143) 
     - locked <0x00000000eb2070b8> (a java.lang.ref.ReferenceQueue$Lock) 
     at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164) 
     at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209) 

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00000000023ae000 nid=0x21f4 in Object.wait() [0x0000000015c1f000] 
    java.lang.Thread.State: WAITING (on object monitor) 
     at java.lang.Object.wait(Native Method) 
     - waiting on <0x00000000eb206af8> (a java.lang.ref.Reference$Lock) 
     at java.lang.Object.wait(Object.java:502) 
     at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157) 
     - locked <0x00000000eb206af8> (a java.lang.ref.Reference$Lock) 

"VM Thread" os_prio=2 tid=0x0000000014987000 nid=0x17cc runnable 

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00000000022d7800 nid=0x2208 runnable 

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00000000022d9000 nid=0x24c4 runnable 

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00000000022da800 nid=0x7b0 runnable 

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00000000022dc000 nid=0x2650 runnable 

"VM Periodic Task Thread" os_prio=2 tid=0x000000001634a800 nid=0x271c waiting on condition 

JNI global references: 321 
+0

Я хочу, чтобы тот же самый дамп потока был сгенерирован из java-кода, поскольку мы получаем от Jstack, так что мы можем анализировать дамп с помощью анализатора дампов потока без каких-либо изменений ... Возможно?? –

+0

Если у вас все в порядке с 'Runtime.getRuntime(). Exec()' hack, он сделает это за вас. В противном случае единственное, что вы не можете получить, это собственный идентификатор. –

 Смежные вопросы

  • Нет связанных вопросов^_^