java運行中從jvm獲取堆棧信息--jstack -m 輸出信息格式說明 解釋

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。

 

 

 

藉助在線工具

GCC and MSVC C++ Demangler

解析之後如下

----------------- 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 -----------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章