java運行中從jvm獲取堆棧信息--jstack -m 輸出信息格式說明 解釋
jstack命令可以生成JVM當前時刻的線程快照。線程快照是當前JVM內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等。
重要的參數有
-F
當 jstack [-l] pid 沒有響應時,強制打印一個堆棧轉儲。
-l
打印關於鎖的其他信息,比如擁有的java.util.concurrent ownable同步器的列表。
-m
打印包含Java和本機C/ C++幀的混合模式堆棧跟蹤。
對於-m輸出的c++幀的堆棧信息怎麼看 如下
----------------- 62 -----------------
0x00007fefc6658995 __pthread_cond_wait + 0xc5
0x00007fefc5747d09 _ZN7Monitor5IWaitEP6Threadl + 0xe9
0x00007fefc57492ae _ZN7Monitor4waitEblb + 0x26e
0x00007fefc58bed65 _ZN16SystemDictionary30resolve_instance_class_or_nullEP6Symbol6HandleS2_P6Thread + 0xa05
0x00007fefc58c0a89 _ZN16SystemDictionary15resolve_or_failEP6Symbol6HandleS2_bP6Thread + 0x49
0x00007fefc534f061 _ZN12ConstantPool13klass_at_implE18constantPoolHandleiP6Thread + 0x3a1
0x00007fefc53513eb _ZN12ConstantPool12klass_ref_atEiP6Thread + 0xbb
0x00007fefc56553c6 _ZN12LinkResolver20resolve_invokestaticER8CallInfo18constantPoolHandleiP6Thread + 0xa6
0x00007fefc56582e0 _ZN12LinkResolver14resolve_invokeER8CallInfo6Handle18constantPoolHandleiN9Bytecodes4CodeEP6Thread + 0x160
0x00007fefc54f8653 _ZN18InterpreterRuntime14resolve_invokeEP10JavaThreadN9Bytecodes4CodeE + 0x5d3
0x00007fefb06a601a * java.util.concurrent.locks.AbstractQueuedSynchronizer.unparkSuccessor(java.util.concurrent.locks.AbstractQueuedSynchronizer$Node) bci:80 line:662 (Interpreted frame)
0x00007fefb067b35d * java.util.concurrent.locks.AbstractQueuedSynchronizer.release(int) bci:26 line:1264 (Interpreted frame)
0x00007fefb067ab30 * java.util.concurrent.locks.ReentrantLock.unlock() bci:5 line:457 (Interpreted frame)
需要理解後面的內容
C/C++語言在編譯以後,函數的名字會被編譯器修改,改成編譯器內部的名字,這個名字會在鏈接的時候用到。
將C++源程序標識符(original C++ source identifier)轉換成C++ ABI標識符(C++ ABI identifier)的過程稱爲mangle;相反的過程稱爲demangle。
每個方法都是以_Z開頭,對於嵌套的名字(比如名字空間中的名字或者是類中間的名字,比如Class::Func)後面緊跟N , 然後是各個名字空間和類的名字,每個名字前是名字字符的長度,再以E結尾。(如果不是嵌套名字則不需要以E結尾)。
比如對於_Z3foov 就是函數foo() , v 表示參數類型爲void。又如N:C:Func 經過修飾後就是 _ZN1N1C4FuncE,這個函數名後面跟參數類型。 如果跟一個整型,那就是_ZN1N1C4FuncEi。
藉助在線工具
解析之後如下
----------------- 62 -----------------
0x00007fefc6658995 __pthread_cond_wait 0xc5
0x00007fefc5747d09 Monitor::IWait(Thread*, long) 0xe9
0x00007fefc57492ae Monitor::wait(bool, long, bool) 0x26e
0x00007fefc58bed65 SystemDictionary::resolve_instance_class_or_null(Symbol*, Handle, Handle, Thread*) 0xa05
0x00007fefc58c0a89 SystemDictionary::resolve_or_fail(Symbol*, Handle, Handle, bool, Thread*) 0x49
0x00007fefc534f061 ConstantPool::klass_at_impl(constantPoolHandle, int, Thread*) 0x3a1
0x00007fefc53513eb ConstantPool::klass_ref_at(int, Thread*) 0xbb
0x00007fefc56553c6 LinkResolver::resolve_invokestatic(CallInfo&, constantPoolHandle, int, Thread*) 0xa6
0x00007fefc56582e0 LinkResolver::resolve_invoke(CallInfo&, Handle, constantPoolHandle, int, Bytecodes::Code, Thread*) 0x160
0x00007fefc54f8653 InterpreterRuntime::resolve_invoke(JavaThread*, Bytecodes::Code) 0x5d3
0x00007fefb06a601a * java.util.concurrent.locks.AbstractQueuedSynchronizer.unparkSuccessor(java.util.concurrent.locks.AbstractQueuedSynchronizer$Node) bci:80 line:662 (Interpreted frame)
0x00007fefb067b35d * java.util.concurrent.locks.AbstractQueuedSynchronizer.release(int) bci:26 line:1264 (Interpreted frame)
0x00007fefb067ab30 * java.util.concurrent.locks.ReentrantLock.unlock() bci:5 line:457 (Interpreted frame)
其他堆棧信息
----------------- 929 -----------------
0x00007fde83e11995 __pthread_cond_wait + 0xc5
0x00007fde82f2f9f5 _ZN13ObjectMonitor4waitElbP6Thread + 0x525
0x00007fde82d29638 JVM_MonitorWait + 0x98
0x00007fde6d020aa8 * java.lang.Object.wait(long) bci:0 (Interpreted frame)
0x00007fde6d00835d * java.lang.ref.ReferenceQueue.remove(long) bci:59 line:144 (Interpreted frame)
0x00007fde6d0080e0 * java.lang.ref.ReferenceQueue.remove() bci:2 line:165 (Interpreted frame)
0x00007fde6d0080e0 * java.lang.ref.Finalizer$FinalizerThread.run() bci:36 line:216 (Interpreted frame)
0x00007fde6d0007a7 <StubRoutines>
0x00007fde82cbe2db _ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread + 0xddb
0x00007fde82cbbba3 _ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread + 0x263
0x00007fde82cbc167 _ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread + 0x47
0x00007fde82d280ec _ZL12thread_entryP10JavaThreadP6Thread + 0x6c
0x00007fde830aff9b _ZN10JavaThread17thread_main_innerEv + 0xdb
0x00007fde830b022f _ZN10JavaThread3runEv + 0x25f
0x00007fde82f42c92 _ZL10java_startP6Thread + 0x102
Locked ownable synchronizers:
----------------- 933 -----------------
0x00007fde83e11995 __pthread_cond_wait + 0xc5
0x00007fde82dbada5 _ZN15JvmtiRawMonitor10SimpleWaitEP6Threadl + 0x185
0x00007fde82dbb51a _ZN15JvmtiRawMonitor8raw_waitElbP6Thread + 0xba
0x00007fde82d97d2c _ZN8JvmtiEnv14RawMonitorWaitEP15JvmtiRawMonitorl + 0xac
0x00007fde81adc3f8 debugMonitorWait + 0x28
0x00007fde81acf034 commandLoop + 0x74
0x00007fde82db6485 _ZN16JvmtiAgentThread22start_function_wrapperEP10JavaThreadP6Thread + 0xb5
0x00007fde830aff9b _ZN10JavaThread17thread_main_innerEv + 0xdb
0x00007fde830b022f _ZN10JavaThread3runEv + 0x25f
0x00007fde82f42c92 _ZL10java_startP6Thread + 0x102
Locked ownable synchronizers:
....
...
..
.
0x00007fde82b08061 _ZN12ConstantPool13klass_at_implE18constantPoolHandleiP6Thread + 0x3a1
0x00007fde82b0a3eb _ZN12ConstantPool12klass_ref_atEiP6Thread + 0xbb
0x00007fde82e0e3c6 _ZN12LinkResolver20resolve_invokestaticER8CallInfo18constantPoolHandleiP6Thread + 0xa6
0x00007fde82e112e0 _ZN12LinkResolver14resolve_invokeER8CallInfo6Handle18constantPoolHandleiN9Bytecodes4CodeEP6Thread + 0x160
0x00007fde82cb1653 _ZN18InterpreterRuntime14resolve_invokeEP10JavaThreadN9Bytecodes4CodeE + 0x5d3
0x00007fde6d033028 * java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(long) bci:78 line:2078 (Interpreted frame)
0x00007fde6d007eb5 * java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() bci:124 line:1093 (Interpreted frame)
0x00007fde6d0080e0 * java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() bci:1 line:809 (Interpreted frame)
0x00007fde6d0081b4 * java.util.concurrent.ThreadPoolExecutor.getTask() bci:149 line:1074 (Interpreted frame)
0x00007fde6d0080e0 * java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) bci:26 line:1134 (Interpreted frame)
0x00007fde6d00835d * java.util.concurrent.ThreadPoolExecutor$Worker.run() bci:5 line:624 (Interpreted frame)
0x00007fde6d0083a2 * java.lang.Thread.run() bci:11 line:748 (Interpreted frame)
0x00007fde6d0007a7 <StubRoutines>
0x00007fde82cbe2db _ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread + 0xddb
0x00007fde82cbbba3 _ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread + 0x263
0x00007fde82cbc167 _ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread + 0x47
0x00007fde82d280ec _ZL12thread_entryP10JavaThreadP6Thread + 0x6c
0x00007fde830aff9b _ZN10JavaThread17thread_main_innerEv + 0xdb
0x00007fde830b022f _ZN10JavaThread3runEv + 0x25f
0x00007fde82f42c92 _ZL10java_startP6Thread + 0x102
Locked ownable synchronizers:
- None
----------------- 1013 -----------------