牌具網(wǎng)站廣告怎么做云優(yōu)客seo排名公司
「JVM」性能調(diào)優(yōu)工具
- 一、jcmd
- 1、jcmd 能干嘛?
- 2、與JVM相關(guān)的命令
- 3、示例
- 二、jmap
- 1、jmap有什么用?
- 2、jmap的命令大全
- 3、示例
- 三、jps
- 1、jps有什么用?
- 2、jps命令以及示例
- 四、jstat
- 1、jstat有什么用?
- 2、jstat命令以及示例
- 五、jstack
- 1、jstack有什么用?
- 2、jstack命令及示例
- 六、visualvm
- 1、visualvm有什么用?
- 七、總結(jié)
一、jcmd
1、jcmd 能干嘛?
jcmd
是 Java 命令行工具的一部分,用于執(zhí)行各種與運(yùn)行中的 Java 進(jìn)程相關(guān)的診斷和管理任務(wù)。它提供了許多有用的操作,可以幫助你監(jiān)視、管理和診斷 Java 應(yīng)用程序。以下是 jcmd
工具的一些常見(jiàn)用途:
- 列出正在運(yùn)行的 Java 進(jìn)程:使用
jcmd -l
命令可以列出系統(tǒng)中當(dāng)前正在運(yùn)行的 Java 進(jìn)程的進(jìn)程 ID 和主類(lèi)。- 打印 Java 進(jìn)程的概要信息:使用
jcmd <pid> VM.native_memory summary
命令可以打印指定 Java 進(jìn)程的本機(jī)內(nèi)存使用情況的摘要信息。- 導(dǎo)出 Java 進(jìn)程的堆轉(zhuǎn)儲(chǔ)文件:使用
jcmd <pid> GC.heap_dump <filename>
命令可以導(dǎo)出指定 Java 進(jìn)程的堆轉(zhuǎn)儲(chǔ)文件,用于分析內(nèi)存使用情況。- 查看 Java 進(jìn)程的線(xiàn)程堆棧:使用
jcmd <pid> Thread.print
命令可以打印指定 Java 進(jìn)程的線(xiàn)程堆棧信息,用于分析線(xiàn)程問(wèn)題和死鎖情況。- 執(zhí)行 JVM 命令:使用
jcmd <pid> <command>
命令可以在運(yùn)行中的 Java 進(jìn)程上執(zhí)行各種 JVM 命令,例如JVM.version
、JVM.flags
等。- 執(zhí)行自定義的診斷命令:你還可以使用
jcmd
工具執(zhí)行自定義的診斷命令,這些命令是由 Java 應(yīng)用程序開(kāi)發(fā)者自己實(shí)現(xiàn)的,用于特定的應(yīng)用程序診斷和管理任務(wù)。
總的來(lái)說(shuō),jcmd
是一個(gè)非常強(qiáng)大的工具,可用于監(jiān)視和調(diào)試運(yùn)行中的 Java 進(jìn)程,提供了許多有用的功能來(lái)幫助你分析和解決 Java 應(yīng)用程序的性能問(wèn)題和其他類(lèi)型的故障。
2、與JVM相關(guān)的命令
jcmd
命令是 Java 的診斷命令,用于執(zhí)行各種與運(yùn)行中的 Java 進(jìn)程相關(guān)的操作。以下是一些常見(jiàn)的 jcmd
命令:
- JVM 狀態(tài)相關(guān)命令:
VM.flags
:顯示 JVM 的標(biāo)志和系統(tǒng)屬性。VM.system_properties
:顯示 JVM 的系統(tǒng)屬性。VM.command_line
:顯示啟動(dòng) JVM 的命令行參數(shù)。VM.version
:顯示 JVM 的版本信息。
- 內(nèi)存相關(guān)命令:
GC.class_histogram
:顯示當(dāng)前堆中各個(gè)類(lèi)的實(shí)例數(shù)目統(tǒng)計(jì)。GC.heap_info
:顯示堆的使用情況統(tǒng)計(jì)信息。GC.run_finalization
:手動(dòng)運(yùn)行終結(jié)器。
- 線(xiàn)程和死鎖相關(guān)命令:
Thread.print
:打印線(xiàn)程堆棧信息。Thread.print -l
:打印詳細(xì)的線(xiàn)程堆棧信息,包括鎖持有者和等待條件。Thread.info
:顯示所有線(xiàn)程的基本信息。Thread.dump
:生成線(xiàn)程轉(zhuǎn)儲(chǔ)文件。
- 性能監(jiān)控和故障處理命令:
VM.uptime
:顯示 JVM 的運(yùn)行時(shí)間。VM.dynlibs
:顯示加載的動(dòng)態(tài)鏈接庫(kù)。ManagementAgent.start_local
:啟動(dòng) JMX 代理以進(jìn)行遠(yuǎn)程監(jiān)控。
- JIT 編譯器命令:
Compiler.print_classes
:打印已編譯類(lèi)的列表。Compiler.disable
:禁用 JIT 編譯器。Compiler.enable
:啟用 JIT 編譯器。
- 示例
[root@es-node3 /]# jcmd 19566 VM.command_line
19566:
VM Arguments:
jvm_args: -Djava.util.Arrays.useLegacyMergeSort=true -javaagent:/app/agent/skywalking-agent.jar=agent.service_name=community,collector.backend_service=10.11.68.78:31180 -Xmx6g -Xms6g -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M -XX:+UseG1GC -XX:+ParallelRefProcEnabled
java_command: /app/intensive-web/community.jar --spring.profiles.active=prod --spring.cloud.nacos.config.file-extension=properties --spring.cloud.nacos.config.server-addr=10.11.68.77:8848 --spring.cloud.nacos.discovery.server-addr=10.11.68.77:8848 --logging.level.com.alibaba.nacos.client.naming=ERROR
java_class_path (initial): /app/intensive-web/community-intensive-web.jar:/app/agent/skywalking-agent.jar
Launcher Type: SUN_STANDARD
命令解釋
這是一個(gè)jcmd命令的輸出結(jié)果,顯示了進(jìn)程ID為19566的Java虛擬機(jī)(JVM)的啟動(dòng)參數(shù)和主要配置信息。具體內(nèi)容包括:
VM Arguments
:JVM的運(yùn)行參數(shù),包括以下幾個(gè):
jvm_args
:JVM的啟動(dòng)參數(shù),包括使用遺留的合并排序算法、SkyWalking代理的配置、堆內(nèi)存大小、元數(shù)據(jù)區(qū)大小、垃圾收> 集器的選擇等。java_command
:Java程序的啟動(dòng)命令,包括應(yīng)用程序的jar包路徑和一些Spring配置參數(shù)。java_class_path (initial)
:Java類(lèi)路徑,包括應(yīng)用程序的jar包路徑和SkyWalking代理的jar包路徑。Launcher Type
:啟動(dòng)器類(lèi)型,此處為SUN_STANDARD。
通過(guò)這些信息,可以查看應(yīng)用程序的啟動(dòng)參數(shù)和配置,了解JVM的運(yùn)行情況,進(jìn)行問(wèn)題排查和性能優(yōu)化。
還有許多其他可用的 jcmd
命令,你可以使用 jcmd <PID> help
來(lái)查看特定 Java 進(jìn)程支持的所有命令。請(qǐng)注意,<PID>
是 Java 進(jìn)程的進(jìn)程 ID,你需要將其替換為實(shí)際的進(jìn)程 ID。
3、示例
jcmd
命令是 Java 命令行工具的一部分,用于執(zhí)行各種與運(yùn)行中的 Java 進(jìn)程相關(guān)的診斷和管理任務(wù)。下面是一些常用的 jcmd
命令及其示范用法:
- 列出正在運(yùn)行的 Java 進(jìn)程:
jcmd -l
示例輸出:
1234 com.example.MyApp5678 com.example.OtherApp
- 打印 Java 進(jìn)程的概要信息:
jcmd 1234 VM.native_memory summary
示例輸出:
Native Memory Tracking:Total: reserved=100MB, committed=10MB...
- 導(dǎo)出 Java 進(jìn)程的堆轉(zhuǎn)儲(chǔ)文件:
jcmd 1234 GC.heap_dump /path/to/dump.hprof
堆轉(zhuǎn)儲(chǔ)文件將保存在指定路徑 /path/to/dump.hprof
。
-
查看 Java 進(jìn)程的線(xiàn)程堆棧:
jcmd 1234 Thread.print
示例輸出:
0x00001 Thread-0 ...
-
執(zhí)行 JVM 命令:
jcmd 1234 JVM.version
示例輸出:
JVM version: 11.0.12+7-LTS JVM information: OpenJDK 64-Bit Server VM by Oracle Corporation
-
執(zhí)行自定義的診斷命令:
jcmd 1234 com.example.MyApp customCommand
這將執(zhí)行 Java 應(yīng)用程序中注冊(cè)的名為
customCommand
的自定義診斷命令。
請(qǐng)注意,以上示例命令中的 1234
是要操作的 Java 進(jìn)程的進(jìn)程 ID,你需要將其替換為真實(shí)的進(jìn)程 ID。你可以通過(guò) jcmd -l
命令列出當(dāng)前正在運(yùn)行的 Java 進(jìn)程及其對(duì)應(yīng)的進(jìn)程 ID。
二、jmap
1、jmap有什么用?
jmap
是 Java 命令行工具中的一個(gè)選項(xiàng),用于生成 Java 應(yīng)用程序的堆轉(zhuǎn)儲(chǔ)快照(Heap Dump Snapshot)。堆轉(zhuǎn)儲(chǔ)快照是一個(gè)二進(jìn)制文件,它包含了 Java 應(yīng)用程序在某個(gè)時(shí)間點(diǎn)上的內(nèi)存使用情況。jmap 的主要用途
如下:
內(nèi)存分析
:通過(guò)生成堆轉(zhuǎn)儲(chǔ)快照,可以獲取 Java 應(yīng)用程序的內(nèi)存使用情況。您可以使用其他工具(如 VisualVM、MAT 等)打開(kāi)和分析堆轉(zhuǎn)儲(chǔ)文件,了解對(duì)象的分配、內(nèi)存泄漏等問(wèn)題,以及查找性能優(yōu)化的機(jī)會(huì)。內(nèi)存監(jiān)控
:您可以使用 jmap 的-histo
選項(xiàng)來(lái)獲取堆轉(zhuǎn)儲(chǔ)快照中各個(gè)類(lèi)的實(shí)例數(shù)量和占用內(nèi)存大小的統(tǒng)計(jì)信息。這對(duì)于監(jiān)控應(yīng)用程序中的對(duì)象分布和內(nèi)存泄漏問(wèn)題很有幫助。堆轉(zhuǎn)儲(chǔ)分析
:jmap 還提供了-dump
選項(xiàng),允許您在運(yùn)行時(shí)生成堆轉(zhuǎn)儲(chǔ)快照。這對(duì)于在應(yīng)用程序發(fā)生嚴(yán)重問(wèn)題(如內(nèi)存溢出)時(shí)進(jìn)行故障排除或分析崩潰狀態(tài)非常有用。 需要注意的是,jmap
命令需要與 Java 虛擬機(jī)(JVM)一起使用,并且只能在支持的平臺(tái)上運(yùn)行。它提供了一種方便的方式來(lái)獲取 Java
應(yīng)用程序的內(nèi)存快照,以便進(jìn)行深入分析和故障排除。
2、jmap的命令大全
以下是常用的 jmap
命令選項(xiàng)列表:
jmap -heap <pid>
:顯示 Java 進(jìn)程的堆內(nèi)存使用情況,包括堆大小、已使用大小、垃圾回收器信息等。jmap -histo <pid>
:顯示 Java 進(jìn)程中各個(gè)類(lèi)的實(shí)例數(shù)量和占用內(nèi)存大小的統(tǒng)計(jì)信息。jmap -histo:live <pid>
:顯示 Java 進(jìn)程中活躍對(duì)象(未被垃圾回收)的類(lèi)的實(shí)例數(shù)量和占用內(nèi)存大小的統(tǒng)計(jì)信息。jmap -dump:live,format=b,file=<filename> <pid>
:生成 Java 進(jìn)程的堆轉(zhuǎn)儲(chǔ)快照,并將其保存到指定的文件中。只包括活躍對(duì)象。jmap -dump:format=b,file=<filename> <pid>
:生成 Java 進(jìn)程的完整堆轉(zhuǎn)儲(chǔ)快照,并將其保存到指定的文件中。jmap -F -dump:format=b,file=<filename> <pid>
:在 Java 進(jìn)程無(wú)響應(yīng)時(shí),強(qiáng)制生成完整堆轉(zhuǎn)儲(chǔ)快照。jmap -J<flag>
:向被監(jiān)視的 JVM 注入 JVM 參數(shù)。jmap -finalizerinfo <pid>
:顯示 Java 進(jìn)程中等待終結(jié)的對(duì)象信息。 這些命令選項(xiàng)的<pid>
參數(shù)是指 Java 進(jìn)程的進(jìn)程ID,用于指定要操作的目標(biāo)進(jìn)程。請(qǐng)注意,部分命令選項(xiàng)可能需要在具有相應(yīng)權(quán)限的用戶(hù)或管理員模式下運(yùn)行。 這只是
jmap 命令的一些常見(jiàn)用法,還有其他更多選項(xiàng)可以通過(guò)運(yùn)行jmap -help
命令來(lái)查看完整的命令說(shuō)明。
3、示例
當(dāng)您使用 jmap -histo <pid>
命令時(shí),可以獲取 Java 進(jìn)程中各個(gè)類(lèi)的實(shí)例數(shù)量和占用內(nèi)存大小的統(tǒng)計(jì)信息。下面是一個(gè)命令示例:
$ jmap -histo 12345
上述命令中的 <pid>
替換為您要監(jiān)視的 Java 進(jìn)程的進(jìn)程ID。執(zhí)行該命令后,jmap 將輸出類(lèi)似以下的結(jié)果:
num #instances #bytes class name
----------------------------------------------1: 12345 1234567 com.example.ClassA2: 5678 987654 com.example.ClassB3: 789 54321 com.example.ClassC... ... ... ...
輸出結(jié)果中的各列含義如下:
num
:類(lèi)的編號(hào),表示在堆中的順序。#instances
:該類(lèi)的實(shí)例數(shù)量。#bytes
:該類(lèi)實(shí)例占用的總內(nèi)存大小。class name
:類(lèi)的全限定名。
通過(guò)這個(gè)輸出,您可以了解 Java 進(jìn)程中各個(gè)類(lèi)的對(duì)象分布情況和內(nèi)存占用情況,有助于發(fā)現(xiàn)可能存在的對(duì)象泄漏或異常內(nèi)存使用情況。
三、jps
1、jps有什么用?
jps
是Java虛擬機(jī)進(jìn)程狀態(tài)工具(Java Process Status),它用于列出當(dāng)前系統(tǒng)中正在運(yùn)行的Java進(jìn)程。jps
命令可以顯示每個(gè)Java進(jìn)程的進(jìn)程ID(PID)和主類(lèi)名稱(chēng),幫助用戶(hù)快速了解Java應(yīng)用程序的運(yùn)行情況。jps
命令的主要用途包括:
列出Java進(jìn)程
:通過(guò)運(yùn)行jps
命令,可以列出當(dāng)前系統(tǒng)中正在運(yùn)行的所有Java進(jìn)程的進(jìn)程ID和主類(lèi)名稱(chēng)。監(jiān)控Java進(jìn)程
:可以使用jps
命令結(jié)合其他監(jiān)控工具,如jstat
、jstack
、jconsole
等,對(duì)Java進(jìn)程進(jìn)行監(jiān)控、診斷和性能分析。校驗(yàn)Java進(jìn)程
:通過(guò)檢查Java進(jìn)程的PID和主類(lèi)名稱(chēng),可以確保指定的Java進(jìn)程正在正確運(yùn)行,并且可以與其他進(jìn)程進(jìn)行交互。
總之,jps
是一個(gè)簡(jiǎn)單而有用的命令行工具,用于列出Java進(jìn)程的信息,方便用戶(hù)進(jìn)行Java應(yīng)用程序的管理和監(jiān)控。
2、jps命令以及示例
以下是一些常用的jps
命令選項(xiàng)和示例:
-
列出正在運(yùn)行的Java進(jìn)程:
jps
-
列出正在運(yùn)行的Java進(jìn)程及其主類(lèi)名稱(chēng):
jps -l
-
列出正在運(yùn)行的Java進(jìn)程及其JVM參數(shù):
jps -m
-
列出正在運(yùn)行的Java進(jìn)程及其JVM參數(shù)、主類(lèi)名稱(chēng):
jps -ml
-
列出正在運(yùn)行的Java進(jìn)程及其JVM參數(shù)、主類(lèi)名稱(chēng)、傳遞給主類(lèi)的參數(shù):
jps -mvl
-
以自定義格式列出Java進(jìn)程信息(進(jìn)程ID和主類(lèi)名稱(chēng)):
jps -F
-
以自定義格式列出Java進(jìn)程信息(進(jìn)程ID、主類(lèi)名稱(chēng)和JVM參數(shù)):
jps -Fm
-
以自定義格式列出Java進(jìn)程信息(進(jìn)程ID、主類(lèi)名稱(chēng)、JVM參數(shù)和傳遞給主類(lèi)的參數(shù)):
jps -Fml
示例用法:
-
顯示正在運(yùn)行的Java進(jìn)程及其主類(lèi)名稱(chēng):
jps -l
輸出示例:
12345 MainClass1 67890 MainClass2
-
顯示正在運(yùn)行的Java進(jìn)程及其JVM參數(shù)、主類(lèi)名稱(chēng):
jps -ml
輸出示例:
12345 -Djava.vm.options=...67890 -Djava.vm.options=... MainClass2```
-
以自定義格式顯示Java進(jìn)程信息(進(jìn)程ID、主類(lèi)名稱(chēng)、JVM參數(shù)和傳遞給主類(lèi)的參數(shù)):
jps -Fml
輸出示例:
12345 MainClass1 -Djava.vm.options=... -Xmx512m 67890 MainClass2 -Djava.vm.options=...
這些示例演示了jps
命令在不同選項(xiàng)下列出Java進(jìn)程信息的用法。您可以根據(jù)需求選擇合適的選項(xiàng)來(lái)查看特定的Java進(jìn)程信息。
四、jstat
1、jstat有什么用?
jstat
是Java統(tǒng)計(jì)監(jiān)視工具(Java Statistics Monitoring),它用于收集和顯示與Java虛擬機(jī)(JVM)相關(guān)的各種運(yùn)行時(shí)統(tǒng)計(jì)數(shù)據(jù)。通過(guò)jstat
命令,您可以實(shí)時(shí)監(jiān)測(cè)和分析Java應(yīng)用程序的性能指標(biāo),從而對(duì)應(yīng)用程序進(jìn)行優(yōu)化和故障排除。
jstat
的主要用途包括:
- 監(jiān)視Java堆內(nèi)存使用情況:通過(guò)
jstat -gc
命令可以獲取Java堆內(nèi)存的使用情況,包括堆的容量、使用量、垃圾回收等信息。- 監(jiān)視類(lèi)加載和卸載情況:使用
jstat -class
命令可以查看已加載和已卸載的類(lèi)數(shù)量和大小,以及類(lèi)加載器的使用情況。- 監(jiān)視垃圾回收情況:通過(guò)
jstat -gc
命令可以觀(guān)察垃圾回收的執(zhí)行次數(shù)、時(shí)間和垃圾回收器的工作狀態(tài),幫助分析和調(diào)整垃圾回收策略。- 監(jiān)視線(xiàn)程情況:使用
jstat -t
命令可以查看線(xiàn)程數(shù)、各種線(xiàn)程狀態(tài)以及峰值線(xiàn)程數(shù)等信息,有助于發(fā)現(xiàn)線(xiàn)程問(wèn)題和優(yōu)化線(xiàn)程使用。- 監(jiān)視編譯情況:通過(guò)
jstat -compiler
命令可以監(jiān)視即時(shí)編譯器的使用情況,包括編譯任務(wù)數(shù)量、成功編譯次數(shù)等。- 監(jiān)視類(lèi)加載器情況:使用
jstat -loader
命令可以觀(guān)察類(lèi)加載器的使用情況,包括類(lèi)加載器數(shù)量、類(lèi)加載和卸載次數(shù)等。
總之,jstat
是一個(gè)強(qiáng)大的工具,可用于實(shí)時(shí)監(jiān)控和收集Java應(yīng)用程序的運(yùn)行時(shí)統(tǒng)計(jì)數(shù)據(jù),幫助開(kāi)發(fā)人員了解應(yīng)用程序的性能狀況,并進(jìn)行性能調(diào)優(yōu)和故障排除。
2、jstat命令以及示例
jstat
命令用于收集和顯示與Java虛擬機(jī)(JVM)相關(guān)的各種運(yùn)行時(shí)統(tǒng)計(jì)數(shù)據(jù)。下面是一些常用的jstat
命令及其示例用法:
-
監(jiān)視堆內(nèi)存使用情況:
jstat -gc <pid> <interval> <count>
示例:
jstat -gc 12345 1000 10
-
監(jiān)視新生代和老年代的大小、容量和使用情況:
jstat -gcutil <pid> <interval> <count>
示例:
jstat -gcutil 12345 1000 10
-
監(jiān)視類(lèi)加載和卸載情況:
jstat -class <pid> <interval> <count>
示例:
jstat -class 12345 1000 10
-
監(jiān)視線(xiàn)程數(shù)、線(xiàn)程狀態(tài)和峰值線(xiàn)程數(shù):
jstat -t <pid> <interval> <count>
示例:
jstat -t 12345 1000 10
-
監(jiān)視編譯器的編譯任務(wù)數(shù)量和成功編譯次數(shù):
jstat -compiler <pid> <interval> <count>
示例:
jstat -compiler 12345 1000 10
-
監(jiān)視類(lèi)加載器的數(shù)量、類(lèi)加載和卸載次數(shù):
jstat -loader <pid> <interval> <count>
示例:
jstat -loader 12345 1000 10
這些示例中的參數(shù)含義如下:
<pid>
:Java應(yīng)用程序的進(jìn)程ID。<interval>
:數(shù)據(jù)收集時(shí)間間隔(以毫秒為單位)。<count>
:要收集的數(shù)據(jù)點(diǎn)數(shù)量。
執(zhí)行以上命令后,jstat
會(huì)定期收集指定時(shí)間間隔內(nèi)持續(xù)的運(yùn)行時(shí)統(tǒng)計(jì)數(shù)據(jù),并輸出到控制臺(tái)。您可以根據(jù)實(shí)際需求選擇適當(dāng)?shù)?code>jstat命令和參數(shù)來(lái)監(jiān)視和分析Java應(yīng)用程序的運(yùn)行時(shí)性能指標(biāo)。
五、jstack
1、jstack有什么用?
jstack
是Java開(kāi)發(fā)中的一個(gè)命令行工具,用于生成Java虛擬機(jī)(JVM)當(dāng)前運(yùn)行時(shí)的線(xiàn)程快照。它可以幫助開(kāi)發(fā)人員識(shí)別和解決多線(xiàn)程相關(guān)的問(wèn)題。通過(guò)運(yùn)行jstack
命令,可以獲取JVM中所有線(xiàn)程的狀態(tài)和堆棧信息。這對(duì)于分析死鎖、線(xiàn)程阻塞、死循環(huán)等問(wèn)題非常有用。以下是jstack
主要的應(yīng)用場(chǎng)景和用途:
分析死鎖
:jstack
可以輸出線(xiàn)程的堆棧信息,幫助識(shí)別當(dāng)多個(gè)線(xiàn)程因?yàn)榛ハ嗟却Y源而無(wú)法繼續(xù)執(zhí)行的情況,即死鎖。
監(jiān)視線(xiàn)程
:jstack`可以周期性地獲取線(xiàn)程快照,并輸出線(xiàn)程的狀態(tài)、執(zhí)行軌跡和調(diào)用堆棧等信息,幫助跟蹤和監(jiān)視應(yīng)用程序中的線(xiàn)程活動(dòng)。
分析性能問(wèn)題
:通過(guò)查看線(xiàn)程的狀態(tài)和堆棧信息,可以了解線(xiàn)程的執(zhí)行情況,找到可能存在的性能瓶頸或潛在的資源競(jìng)爭(zhēng)問(wèn)題。
定位線(xiàn)程阻塞
:jstack
可以顯示線(xiàn)程等待的資源和鎖,幫助找出線(xiàn)程阻塞的原因,并進(jìn)行相應(yīng)的調(diào)優(yōu)。
檢測(cè)死循環(huán)
:通過(guò)查看線(xiàn)程的堆棧信息,可以判斷是否存在死循環(huán),并定位導(dǎo)致死循環(huán)的代碼位置。
總之,jstack
是一個(gè)用于分析和調(diào)試多線(xiàn)程應(yīng)用程序的工具,它提供了線(xiàn)程狀態(tài)、堆棧信息等有價(jià)值的數(shù)據(jù),幫助開(kāi)發(fā)人員定位和解決與多線(xiàn)程相關(guān)的問(wèn)題。
2、jstack命令及示例
jstack
命令用于生成Java虛擬機(jī)(JVM)線(xiàn)程快照。以下是jstack命令的基本語(yǔ)法和示例:
語(yǔ)法:
jstack [ options ] <pid>
參數(shù)說(shuō)明:
options
:可選參數(shù),用于指定jstack的功能和輸出格式。常用的選項(xiàng)包括:
-l:
長(zhǎng)格式輸出,包括關(guān)聯(lián)的鎖信息。-m
: 輸出額外的JVM內(nèi)存相關(guān)信息。pid
:必選參數(shù),指定目標(biāo)Java進(jìn)程的進(jìn)程ID。
示例1:生成線(xiàn)程快照
jstack 12345
上述命令會(huì)生成進(jìn)程ID為12345的Java進(jìn)程的線(xiàn)程快照,并輸出到控制臺(tái)。
示例2:生成詳細(xì)線(xiàn)程快照
jstack -l 12345
上述命令會(huì)生成進(jìn)程ID為12345的Java進(jìn)程的詳細(xì)線(xiàn)程快照,并輸出到控制臺(tái)。其中,-l選項(xiàng)指定了長(zhǎng)格式輸出,包括關(guān)聯(lián)的鎖信息。
示例3:生成線(xiàn)程快照并輸出到文件
jstack -m 12345 > thread_dump.txt
上述命令會(huì)生成進(jìn)程ID為12345的Java進(jìn)程的線(xiàn)程快照,并將輸出保存到名為thread_dump.txt的文件中。其中,-m選項(xiàng)指定了輸出額外的JVM內(nèi)存相關(guān)信息。
通過(guò)這些示例,你可以使用jstack命令來(lái)生成Java進(jìn)程的線(xiàn)程快照,并獲取線(xiàn)程狀態(tài)和堆棧信息,用于調(diào)試和分析多線(xiàn)程相關(guān)的問(wèn)題。注意,需要將示例中的"12345"替換為目標(biāo)Java進(jìn)程的實(shí)際進(jìn)程ID。
六、visualvm
1、visualvm有什么用?
JVisualVM
是一個(gè)用于監(jiān)視、分析和調(diào)優(yōu) Java 虛擬機(jī)(JVM)應(yīng)用程序的工具。下面是一些使用 JVisualVM 的基本步驟:
啟動(dòng) JVisualVM
: 在 JDK 安裝目錄的bin
目錄下,可以找到名為jvisualvm
的可執(zhí)行文件(Windows 系統(tǒng)為jvisualvm.exe
)。雙擊運(yùn)行該文件來(lái)啟動(dòng) JVisualVM 工具。連接到目標(biāo)應(yīng)用程序``: JVisualVM 可以通過(guò)多種方式連接到目標(biāo)應(yīng)用程序,最常用的方式是在工具的左側(cè)導(dǎo)航欄中選擇 “本地” 或 “遠(yuǎn)程” 選項(xiàng),然后在應(yīng)用程序列表中選中你想要連接的應(yīng)用程序,點(diǎn)擊 “連接” 按鈕進(jìn)行連接。
監(jiān)視和分析應(yīng)用程序
: 連接成功后,JVisualVM 將顯示目標(biāo)應(yīng)用程序的概覽頁(yè)面,其中包含了應(yīng)用程序的概要信息。你可以使用工具欄上的不同選項(xiàng)卡來(lái)查看各種監(jiān)視數(shù)據(jù),如內(nèi)存、線(xiàn)程、GC、CPU
等。你還可以生成堆棧跟蹤、線(xiàn)程轉(zhuǎn)儲(chǔ)和剖析結(jié)果,以幫助分析和解決性能問(wèn)題。
進(jìn)行性能調(diào)優(yōu)
: JVisualVM 提供了一些用于性能調(diào)優(yōu)的工具。例如,可以使用內(nèi)存分析器來(lái)查找內(nèi)存泄漏和優(yōu)化內(nèi)存使用??梢允褂闷饰銎鱽?lái)識(shí)別應(yīng)用程序中的熱點(diǎn),找到性能瓶頸并進(jìn)行優(yōu)化。
此外,JVisualVM 還支持插件擴(kuò)展
,你可以安裝和啟用各種插件來(lái)增強(qiáng)其功能和可定制性。
請(qǐng)注意,要使用 JVisualVM,目標(biāo)應(yīng)用程序必須在運(yùn)行時(shí)啟用 JMX(Java Management Extensions)功能。如果你想遠(yuǎn)程監(jiān)視一個(gè)應(yīng)用程序,還需要確保目標(biāo)主機(jī)上的防火墻和網(wǎng)絡(luò)設(shè)置允許 JMX 連接。
七、總結(jié)
下面是對(duì)一些常用的JVM相關(guān)工具和命令的總結(jié):
jstat
(Java Virtual Machine Statistics Monitoring Tool):用于監(jiān)控和測(cè)量Java虛擬機(jī)的各種統(tǒng)計(jì)信息,如垃圾回收、類(lèi)裝載、內(nèi)存、線(xiàn)程等??梢允褂胘stat命令來(lái)獲取這些信息,并可以以文本或CSV格式輸出。
jstack
(Java Stack Trace):用于生成Java虛擬機(jī)當(dāng)前運(yùn)行時(shí)的線(xiàn)程快照。通過(guò)jstack命令,可以獲取線(xiàn)程的狀態(tài)和堆棧信息,幫助分析死鎖、線(xiàn)程阻塞等問(wèn)題。
jmap
(Java Memory Map):用于生成Java虛擬機(jī)的內(nèi)存轉(zhuǎn)儲(chǔ)快照??梢允褂胘map命令來(lái)獲取堆內(nèi)存使用情況、類(lèi)統(tǒng)計(jì)信息、內(nèi)存分配情況等。還可以生成堆轉(zhuǎn)儲(chǔ)文件,供后續(xù)分析使用。
jps
(Java Virtual Machine Process Status Tool):用于列出當(dāng)前運(yùn)行的Java進(jìn)程。jps命令可以輸出Java進(jìn)程的進(jìn)程ID和主類(lèi)名,方便在命令行中查看Java進(jìn)程的狀態(tài)。
VisualVM
:是一個(gè)功能強(qiáng)大的Java虛擬機(jī)監(jiān)視和分析工具。它可以通過(guò)插件支持各種功能,如垃圾回收監(jiān)控、線(xiàn)程分析、內(nèi)存分析、性能剖析等。VisualVM提供了直觀(guān)的圖形界面,方便進(jìn)行實(shí)時(shí)監(jiān)控和分析。
這些工具和命令在JVM性能調(diào)優(yōu)、故障排查和內(nèi)存分析中非常有用。開(kāi)發(fā)人員可以根據(jù)具體的需求選擇適合的工具來(lái)監(jiān)控和分析Java應(yīng)用程序,以?xún)?yōu)化性能并解決潛在的問(wèn)題。