2016-04-18 11 views
6

Tôi muốn tạo kết xuất chuỗi thông qua mã java, tôi đã thử sử dụng ThreadMXBean cho điều này nhưng tôi không nhận được kết xuất chuỗi theo định dạng thích hợp vì chúng tôi đang sử dụng lệnh jstack. Vui lòng bất cứ ai có thể cung cấp một số help..is của họ bất kỳ cách nào khác để có được chủ đề bãi ... sử dụng bất kỳ API khác .. Định dạng của chủ đề bãi mà tôi muốn là -Làm cách nào để nắm bắt kết xuất chuỗi bằng cách sử dụng Mã 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

Tôi tin 'jstack' bản thân sử dụng' ThreadMXBean' để có được thông tin này. Phải thừa nhận rằng, điều này khác với kết xuất chuỗi mà người gửi gửi 'kill -3' đến tiến trình. –

+0

yeah nhưng khi tôi đang sử dụng ThreadMXBean tôi không nhận được thông tin đầy đủ như tid, nid, thread là daemon hay không ... những thông tin này tôi không thể nhận được thông qua threadMXBean. –

+0

thật không may, tôi không nghĩ rằng java phơi bày một cách để có được những chi tiết bổ sung. – jtahlborn

Trả lời

2

Bạn có thể sử dụng để có được Thread.getAllStackTraces() hầu hết điều này.

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

Sử dụng điều này cũng không nhận được thông tin đầy đủ như tid, nid, chủ đề là daemon hay không ... –

+0

@RishiArora Khóa trong 'Bản đồ' là đối tượng' Chủ đề'. Nó phơi bày những điều này. 'Nid' là gì? – Savior

+0

@RishiArora Tôi không chắc chắn một 'tid' là gì hoặc nó được sử dụng cho cái gì, nid' là id quá trình trong hexidecimal. Bạn có thể nhận được rằng bằng cách sử dụng JNA nhưng tôi không chắc chắn bạn cần nó. Bạn có thể nhận 'Thread.isDaemon()' –

4

Hãy thử ManagementFactory.getThreadMXBean().dumpAllThreads(true, true) sử dụng một cái gì đó giống như

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

Hoặc bạn có thể hack theo cách của bạn xung quanh và thực sự gọi jstack qua 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)); 

Dưới đây là đầu ra cho một chương trình mẫu sử dụng

ThreadMXBean:

"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 (thorugh giao diện điều khiển hoặc thông qua 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

Tôi muốn kết xuất chính xác cùng một chuỗi được tạo từ mã java như chúng ta đang nhận được từ Jstack, để chúng ta có thể phân tích kết xuất bằng Trình phân tích kết xuất, mà không có bất kỳ sửa đổi nào ... nó có thể ?? –

+0

Nếu bạn ổn với 'Runtime.getRuntime(). Exec()' hack, nó sẽ làm điều đó cho bạn. Nếu không, điều duy nhất bạn không thể nhận được là ID gốc. –

Các vấn đề liên quan