JDK14性能管理工具之jstack使用介紹
在之前的文章中,我們介紹了JDK14中jstat工具的使用,本文我們再深入探討一下jstack工具的使用。
jstack工具主要用來打印java堆棧信息,主要是java的class名字,方法名,字節(jié)碼索引,行數(shù)等信息。
jstack的命令格式
Usage: jstack [-l][-e] <pid> (to connect to running process) Options: -l long listing. Prints additional information about locks -e extended listing. Prints additional information about threads -? -h --help -help to print this help message
jstack的參數(shù)比較簡單,l可以包含鎖的信息,e包含了額外的信息。
jstack的使用
我們舉個例子:
jstack -l -e 53528
輸出結(jié)果如下:
2020-05-09 21:46:51
Full thread dump Java HotSpot(TM) 64-Bit Server VM (14.0.1+7 mixed mode, sharing):
Threads class SMR info:
_java_thread_list=0x00007fda0660eb00, length=14, elements={
0x00007fda04811000, 0x00007fda05845800, 0x00007fda05012000, 0x00007fda05847800,
0x00007fda05843800, 0x00007fda05854800, 0x00007fda0481f000, 0x00007fda0481f800,
0x00007fda04018800, 0x00007fda041ff800, 0x00007fda05a28800, 0x00007fda05b1a800,
0x00007fda05b1d800, 0x00007fda042be000
}
"Reference Handler" #2 daemon prio=10 os_prio=31 cpu=0.67ms elapsed=66335.21s allocated=0B defined_classes=0 tid=0x00007fda04811000 nid=0x4603 waiting on condition [0x000070000afe1000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList(java.base@14.0.1/Native Method)
at java.lang.ref.Reference.processPendingReferences(java.base@14.0.1/Reference.java:241)
at java.lang.ref.Reference$ReferenceHandler.run(java.base@14.0.1/Reference.java:213)
Locked ownable synchronizers:
- None
...
"VM Thread" os_prio=31 cpu=1433.78ms elapsed=66335.22s tid=0x00007fda0506b000 nid=0x4803 runnable
"GC Thread#0" os_prio=31 cpu=18.63ms elapsed=66335.23s tid=0x00007fda0502a800 nid=0x3203 runnable
"GC Thread#1" os_prio=31 cpu=19.64ms elapsed=66334.06s tid=0x00007fda050e5800 nid=0x9d03 runnable
"GC Thread#2" os_prio=31 cpu=17.72ms elapsed=66334.06s tid=0x00007fda05015000 nid=0x6203 runnable
"GC Thread#3" os_prio=31 cpu=14.57ms elapsed=66332.78s tid=0x00007fda05138800 nid=0x6503 runnable
"G1 Main Marker" os_prio=31 cpu=0.25ms elapsed=66335.23s tid=0x00007fda05031000 nid=0x3303 runnable
"G1 Conc#0" os_prio=31 cpu=14.85ms elapsed=66335.23s tid=0x00007fda05031800 nid=0x4b03 runnable
"G1 Refine#0" os_prio=31 cpu=3.25ms elapsed=66335.23s tid=0x00007fda0583a800 nid=0x4a03 runnable
"G1 Young RemSet Sampling" os_prio=31 cpu=5929.79ms elapsed=66335.23s tid=0x00007fda0505a800 nid=0x3503 runnable
"VM Periodic Task Thread" os_prio=31 cpu=21862.12ms elapsed=66335.13s tid=0x00007fda0505b000 nid=0xa103 waiting on condition
JNI global refs: 43, weak refs: 45
輸出的結(jié)果我們可以分為下面幾個部分:
JVM虛擬機信息
第一部分是JVM虛擬機的信息
2020-05-09 21:46:51
Full thread dump Java HotSpot(TM) 64-Bit Server VM (14.0.1+7 mixed mode, sharing):
上面顯示了虛擬機的thread dump時間和虛擬機的版本等信息。
Threads class SMR info
第二部分是JVM中非JVM(非VM和非GC的線程)的內(nèi)部線程信息。
Threads class SMR info:
_java_thread_list=0x00007fda0660eb00, length=14, elements={
0x00007fda04811000, 0x00007fda05845800, 0x00007fda05012000, 0x00007fda05847800,
0x00007fda05843800, 0x00007fda05854800, 0x00007fda0481f000, 0x00007fda0481f800,
0x00007fda04018800, 0x00007fda041ff800, 0x00007fda05a28800, 0x00007fda05b1a800,
0x00007fda05b1d800, 0x00007fda042be000
}
這些elements是和后面線程的tid相匹配的。表示的是本地線程對象的地址,注意這些不是線程的ID。
大家可能注意到了里面寫的是SMR, SMR全稱是Safe Memory Reclamation。
什么是SMR呢?簡單點講就是安全的內(nèi)存分配,一般這個問題會出現(xiàn)在非自動GC的編程語言中如C++。在這些語言中,需要自己來為對象分配內(nèi)存和銷毀對象,這樣就可能導(dǎo)致在多線程的環(huán)境中,一個地址可能被分配給了多個對象,從而出現(xiàn)了內(nèi)存分配的不安全。
線程信息
第三部分就是線程的具體信息了:
"Reference Handler" #2 daemon prio=10 os_prio=31 cpu=0.67ms elapsed=66335.21s allocated=0B defined_classes=0 tid=0x00007fda04811000 nid=0x4603 waiting on condition [0x000070000afe1000] java.lang.Thread.State: RUNNABLE at java.lang.ref.Reference.waitForReferencePendingList(java.base@14.0.1/Native Method) at java.lang.ref.Reference.processPendingReferences(java.base@14.0.1/Reference.java:241) at java.lang.ref.Reference$ReferenceHandler.run(java.base@14.0.1/Reference.java:213) Locked ownable synchronizers: - None
按照字段的順序,我們可以把線程信息分為下面幾個部分:
- 線程名字:例如Reference Handler
- 線程的ID:例如#2
- 是否守護(hù)線程:例如daemon,daemon threads是低優(yōu)先級的thread,它的作用是為User Thread提供服務(wù)。 因為daemon threads的低優(yōu)先級,并且僅為user thread提供服務(wù),所以當(dāng)所有的user thread都結(jié)束之后,JVM會自動退出,不管是否還有daemon threads在運行中。
- 優(yōu)先級:例如prio=10
- OS線程的優(yōu)先級:例如os_prio=31
- cpu時間:線程獲得CPU的時間,例如cpu=0.67ms
- elapsed:線程啟動后經(jīng)過的wall clock time
- allocated:本線程分配的分配的bytes數(shù)
- defined_classes:本線程定義的class個數(shù)
注意'allocated=' 和 ‘defined_classes=' 必須要開啟 -XX:+PrintExtendedThreadInfo才會輸出數(shù)據(jù)。
- Address:java線程的地址,例如:tid=0x00007fda04811000
- OS線程ID:例如nid=0x4603
- 線程狀態(tài):例如waiting on condition
- 最新的Java堆棧指針:最新的java堆棧指針SP,例如:[0x000070000afe1000]
接下來就是線程的堆棧信息:
java.lang.Thread.State: RUNNABLE at java.lang.ref.Reference.waitForReferencePendingList(java.base@14.0.1/Native Method) at java.lang.ref.Reference.processPendingReferences(java.base@14.0.1/Reference.java:241) at java.lang.ref.Reference$ReferenceHandler.run(java.base@14.0.1/Reference.java:213)
上面的例子是線程的堆棧信息,并且列出來了線程的狀態(tài)。
Locked Ownable Synchronizer
接下來的部分是該線程擁有的,可用的用于同步的排它鎖對象。
Ownable Synchronizer是一個同步器,這個同步器的同步屬性是通過使用AbstractOwnableSynchronizer或者它的子類來實現(xiàn)的。
例如ReentrantLock和ReentrantReadWriteLock中的write-lock(注意不是read-lock,因為需要排它性)就是兩個例子。
JVM Threads
接下來是JVM的線程信息,因為這個線程是JVM內(nèi)部的,所以沒有線程ID:
"VM Thread" os_prio=31 cpu=1433.78ms elapsed=66335.22s tid=0x00007fda0506b000 nid=0x4803 runnable
"GC Thread#0" os_prio=31 cpu=18.63ms elapsed=66335.23s tid=0x00007fda0502a800 nid=0x3203 runnable
"GC Thread#1" os_prio=31 cpu=19.64ms elapsed=66334.06s tid=0x00007fda050e5800 nid=0x9d03 runnable
"GC Thread#2" os_prio=31 cpu=17.72ms elapsed=66334.06s tid=0x00007fda05015000 nid=0x6203 runnable
"GC Thread#3" os_prio=31 cpu=14.57ms elapsed=66332.78s tid=0x00007fda05138800 nid=0x6503 runnable
"G1 Main Marker" os_prio=31 cpu=0.25ms elapsed=66335.23s tid=0x00007fda05031000 nid=0x3303 runnable
"G1 Conc#0" os_prio=31 cpu=14.85ms elapsed=66335.23s tid=0x00007fda05031800 nid=0x4b03 runnable
"G1 Refine#0" os_prio=31 cpu=3.25ms elapsed=66335.23s tid=0x00007fda0583a800 nid=0x4a03 runnable
"G1 Young RemSet Sampling" os_prio=31 cpu=5929.79ms elapsed=66335.23s tid=0x00007fda0505a800 nid=0x3503 runnable
"VM Periodic Task Thread" os_prio=31 cpu=21862.12ms elapsed=66335.13s tid=0x00007fda0505b000 nid=0xa103 waiting on condition
JNI References
最后一部分是JNI(Java Native Interface)引用的信息,注意這些引用可能會導(dǎo)致內(nèi)存泄露,因為這些native的引用并不會被自動垃圾回收。
JNI global refs: 43, weak refs: 45
jstack是分析線程的非常強大的工具,希望大家能夠使用起來。
總結(jié)
到此這篇關(guān)于JDK14性能管理工具之jstack使用介紹的文章就介紹到這了,更多相關(guān)JDK14性能管理工具jstack使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JS性能優(yōu)化實現(xiàn)方法及優(yōu)點進(jìn)行
- js 函數(shù)性能比較方法
- 高性能js數(shù)組去重(12種方法,史上最全)
- Vue.js 無限滾動列表性能優(yōu)化方案
- 基于Nuxt.js項目的服務(wù)端性能優(yōu)化與錯誤檢測(容錯處理)
- 利用JavaScript的Map提升性能的方法詳解
- javascript for循環(huán)性能測試示例
- 監(jiān)控Nodejs的性能實例代碼
- 詳解如何提升JSON.stringify()的性能
- Javascript三種字符串連接方式及性能比較
- 實現(xiàn)高性能javascript的注意事項
- 如何使用gpu.js改善JavaScript的性能
相關(guān)文章
使用@Service注解出現(xiàn)No bean named 'xxxx'&
這篇文章主要介紹了使用@Service注解出現(xiàn)No bean named 'xxxx' available]錯誤的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08SpringBoot指標(biāo)監(jiān)控功能實現(xiàn)
這篇文章主要介紹了SpringBoot指標(biāo)監(jiān)控功能實現(xiàn),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06Intellij IDEA 配置Subversion插件實現(xiàn)步驟詳解
這篇文章主要介紹了Intellij IDEA 配置Subversion插件實現(xiàn)步驟詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05SpringBoot+thymeleaf+Echarts+Mysql 實現(xiàn)數(shù)據(jù)可視化讀取的示例
本文主要介紹了SpringBoot+thymeleaf+Echarts+Mysql 實現(xiàn)數(shù)據(jù)可視化讀取的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04詳解spring boot 使用application.properties 進(jìn)行外部配置
這篇文章主要介紹了詳解spring boot 使用application.properties 進(jìn)行外部配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03一文教會Java新手使用Spring?MVC中的查詢字符串和查詢參數(shù)
在使用springMVC框架構(gòu)建web應(yīng)用,客戶端常會請求字符串、整型、json等格式的數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于通過一文教會Java新手使用Spring?MVC中的查詢字符串和查詢參數(shù)的相關(guān)資料,需要的朋友可以參考下2024-01-01