更新時(shí)間:2022-12-08 10:33:34 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽3341次
相信大家對(duì)線程的基本概念已經(jīng)有所了解,用Java線程并發(fā)的基本單位。在大多數(shù)情況下,應(yīng)用程序的吞吐量增加當(dāng)創(chuàng)建多個(gè)線程并行任務(wù)。
然而,總有一個(gè)飽和點(diǎn)。畢竟,一個(gè)應(yīng)用程序的吞吐量取決于CPU和內(nèi)存資源。在一定限制,增加線程的數(shù)量會(huì)導(dǎo)致高內(nèi)存,線程上下文切換等。
所以一個(gè)好的起點(diǎn)在故障診斷Java應(yīng)用程序中的一個(gè)高端內(nèi)存問(wèn)題是監(jiān)控線程的數(shù)量。在本教程中,我們將看看一些方式我們可以檢查Java進(jìn)程創(chuàng)建的線程的數(shù)量。
最簡(jiǎn)單的方式看到Java線程的數(shù)量是使用像Java VisualVM的圖形工具。除了應(yīng)用程序線程,Java VisualVM還列出了GC或任何其他線程所使用的應(yīng)用程序(如JMX線程)。
此外,它還顯示了諸如線程狀態(tài)及其持續(xù)時(shí)間:
監(jiān)控線程的數(shù)量是在Java VisualVM最基本的特征。一般來(lái)說(shuō),圖形工具更先進(jìn),允許應(yīng)用程序的實(shí)時(shí)監(jiān)控。例如,Java VisualVM允許我們樣品CPU堆棧跟蹤,從而找到一個(gè)類或方法,可能會(huì)導(dǎo)致CPU瓶頸。
Java VisualVM分布與JDK安裝在Windows機(jī)器上。應(yīng)用程序部署在Linux上,我們需要連接到遠(yuǎn)程應(yīng)用程序。這需要JMX VM參數(shù)。
因此,這些工具不會(huì)工作,如果一個(gè)應(yīng)用程序已經(jīng)運(yùn)行沒(méi)有這些參數(shù)。在后面的小節(jié)中,我們將看到如何使用命令行工具獲得線程的數(shù)量。
在一些用例中,我們可以找到應(yīng)用程序中線程的數(shù)量。例如,顯示在日志監(jiān)視儀表板或公開(kāi)。
在這種情況下,我們依靠Java api的線程數(shù)。值得慶幸的是,有一個(gè)activeCount () API在線程類:
public class FindNumberofThreads {
public static void main(String[] args) {
System.out.println("Number of threads " + Thread.activeCount());
}
}
和輸出將會(huì)是:
Number of threads 2
值得注意的是,如果我們看到在Java VisualVM線程的數(shù)量,我們將會(huì)看到更多的相同的應(yīng)用程序線程。這是因?yàn)閍ctiveCount()只返回線程的數(shù)量在同一ThreadGroup。Java的所有線程分為組織更容易管理。
在這個(gè)例子中,我們剛剛父ThreadGroup,即。主要:
public static void main(String[] args) {
System.out.println("Current Thread Group - " + Thread.currentThread().getThreadGroup().getName());
}
Current Thread Group - main
如果有許多線程組在Java應(yīng)用程序中,activeCount()不會(huì)給一個(gè)正確的輸出。例如,它不會(huì)返回GC線程的數(shù)量。
在這樣的場(chǎng)景中,我們可以使用JMX API:
public static void main(String[] args) {
System.out.println("Total Number of threads " + ManagementFactory.getThreadMXBean().getThreadCount());
}
這個(gè)API返回總數(shù)從所有線程的線程組,GC, JMX,等等。
Total Number of threads 6
事實(shí)上,JMX圖形工具如Java VisualVM使用相同的API的數(shù)據(jù)。
之前,我們討論了Java VisualVM,圖形分析住線程在一個(gè)應(yīng)用程序的工具。雖然生活的可視化線程是一個(gè)偉大的工具,它有一個(gè)小的影響應(yīng)用程序的性能。因此不建議用于生產(chǎn)環(huán)境。
此外,正如我們之前所討論的,在Linux中Java VisualVM需要遠(yuǎn)程連接。事實(shí)上,在某些情況下,它需要額外的配置。例如,一個(gè)應(yīng)用程序運(yùn)行在一個(gè)碼頭工人或Kubernetes需要額外的服務(wù)和端口配置。
在這種情況下,我們必須依靠命令行工具在主機(jī)環(huán)境中線程數(shù)。
幸運(yùn)的是,Java提供一些命令線程轉(zhuǎn)儲(chǔ)。我們可以分析一個(gè)線程轉(zhuǎn)儲(chǔ)為一個(gè)文本文件或使用一個(gè)線程dump analyzer工具檢查線程的數(shù)量以及它們的狀態(tài)。
阿里巴巴阿爾薩斯是另一個(gè)偉大的command-l
top -H -p 1
這里,- h是一個(gè)命令行選項(xiàng)來(lái)顯示每個(gè)線程在一個(gè)Java進(jìn)程。如果沒(méi)有這個(gè)標(biāo)志,上面的命令將顯示進(jìn)程中的所有線程的綜合統(tǒng)計(jì)。- p選項(xiàng)過(guò)濾器的輸出目標(biāo)應(yīng)用程序的進(jìn)程id:
top - 15:59:44 up 7 days, 19:23, 0 users, load average: 0.52, 0.41, 0.36
Threads: 37 total, 0 running, 37 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.2 us, 2.2 sy, 0.0 ni, 93.4 id, 0.8 wa, 0.0 hi, 0.3 si, 0.0 st
MiB Mem : 1989.2 total, 110.2 free, 1183.1 used, 695.8 buff/cache
MiB Swap: 1024.0 total, 993.0 free, 31.0 used. 838.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 flink 20 0 2612160 304084 29784 S 0.0 14.9 0:00.07 java
275 flink 20 0 2612160 304084 29784 S 0.0 14.9 0:02.87 java
276 flink 20 0 2612160 304084 29784 S 0.0 14.9 0:00.37 VM Thread
277 flink 20 0 2612160 304084 29784 S 0.0 14.9 0:00.00 Reference Handl
278 flink 20 0 2612160 304084 29784 S 0.0 14.9 0:00.00 Finalizer
279 flink 20 0 2612160 304084 29784 S 0.0 14.9 0:00.00 Signal Dispatch
如上圖所示,它顯示了線程id,即。、PID和線程的CPU和內(nèi)存使用率。類似于Java VisualVM,頂部命令將列出所有線程,包括GC, JMX或任何其他子流程。
發(fā)現(xiàn)我們使用的進(jìn)程ID作為參數(shù)在上面的命令中,我們可以使用ps命令:
ps -ef | grep java
事實(shí)上,我們可以使用ps命令來(lái)列出線程:
ps -e -T | grep 1
t選項(xiàng)告訴ps命令列出所有線程開(kāi)始由應(yīng)用程序:
1 1 ? 00:00:00 java
1 275 ? 00:00:02 java
1 276 ? 00:00:00 VM Thread
1 277 ? 00:00:00 Reference Handl
1 278 ? 00:00:00 Finalizer
1 279 ? 00:00:00 Signal Dispatch
1 280 ? 00:00:03 C2 CompilerThre
1 281 ? 00:00:01 C1 CompilerThre
在這里,第一列是PID,第二列顯示了每個(gè)線程Linux線程ID。
在本文中,我們發(fā)現(xiàn)我們有許多方式可以找到Java應(yīng)用程序線程的數(shù)量。在大多數(shù)情況下,使用命令行選項(xiàng)像頂部或ps命令應(yīng)該是首選的方法。
然而,在某些情況下,我們可能還需要圖形工具如Java VisualVM。所有示例代碼都可以在GitHub。以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"告訴你在Java中如何查看線程數(shù)",希望對(duì)大家有幫助,想了解更多可查看Java多線程編程技術(shù)文檔。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743