當(dāng)涉及到 Java 性能分析時,有一系列強(qiáng)大的命令和工具可以幫助開發(fā)人員分析應(yīng)用程序的性能瓶頸、內(nèi)存使用情況和線程問題。以下是一些常用的 Java 性能分析命令和工具,以及它們的詳細(xì)說明和示例。
以下是一些常用的性能分析命令和工具匯總:
命令 | 功能簡述 |
---|---|
jps |
用于查看正在運(yùn)行的 Java 進(jìn)程的狀態(tài)信息。 |
jinfo |
用于查看和修改正在運(yùn)行的 Java 進(jìn)程的 Java 虛擬機(jī)(JVM)參數(shù)和系統(tǒng)屬性。 |
jstack |
用于生成 Java 進(jìn)程的線程轉(zhuǎn)儲信息。 |
jmap |
用于生成 Java 進(jìn)程的內(nèi)存映射信息。 |
jconsole |
是 Java 自帶的監(jiān)控和管理控制臺,它提供了一個圖形化界面,允許您監(jiān)視和管理正在運(yùn)行的 Java 應(yīng)用程序的性能和資源使用情況。 |
jvisualvm |
是一款功能強(qiáng)大的多合一故障診斷和性能監(jiān)控的圖形化工具。 |
1、jps
jps
(JVM Process Status Tool)命令用于查看正在運(yùn)行的 Java 進(jìn)程的狀態(tài)信息,包括進(jìn)程 ID 和主類名。這對于迅速了解系統(tǒng)上正在運(yùn)行的 Java 應(yīng)用程序很有幫助。
1.1 語法
jps [ options ] [ hostid ]
其中,options
是可選的命令行選項,hostid
是可選的 RMI 注冊表主機(jī) ID。下面是一些常用的選項:
-
-q
:只輸出進(jìn)程ID,不包括類名和JAR文件名。 -
-m
:輸出傳遞給main
方法的參數(shù)。 -
-l
:輸出主類全名,或者對于JAR文件,輸出JAR文件路徑。 -
-v
:輸出傳遞給JVM
的參數(shù)。
1.2 示例
假設(shè)您有一個正在運(yùn)行的Java應(yīng)用程序,其主類為com.example.MyApp
,并且它的進(jìn)程ID為12345
。下面是一些使用jps
命令的示例:
-
查看所有 Java 進(jìn)程的進(jìn)程 ID 和主類名:
$ jps 12345 com.example.MyApp 67890 sun.tools.jps.Jps
在上面的輸出中,
12345
是您的Java應(yīng)用程序的進(jìn)程 ID,com.example.MyApp
是應(yīng)用程序的主類名。 -
只輸出 Java 進(jìn)程的進(jìn)程 ID:
$ jps -q 12345 67890
-
輸出 Java 進(jìn)程的進(jìn)程 ID 和傳遞給
main
方法的參數(shù):$ jps -m 12345 com.example.MyApp arg1 arg2 67890 sun.tools.jps.Jps -m
-
輸出 Java 進(jìn)程的進(jìn)程 ID 和主類全名:
$ jps -l 12345 com.example.MyApp 67890 sun.tools.jps.Jps
通過使用不同的選項,您可以根據(jù)需要獲取不同層次的信息。jps
命令對于快速查看正在運(yùn)行的Java 進(jìn)程非常有用,尤其在定位和監(jiān)視Java應(yīng)用程序時。
2、jinfo
jinfo
是一個 Java 命令行工具,用于查看和修改正在運(yùn)行的 Java 進(jìn)程的 Java 虛擬機(jī)(JVM)參數(shù)和系統(tǒng)屬性。通過使用 jinfo
,您可以動態(tài)地檢查和更改 Java 應(yīng)用程序的配置信息,而無需停止應(yīng)用程序。
在很多情況下,Java 應(yīng)用程序不會指定所有的 JVM 參數(shù),開發(fā)人員可能不知道某一個具體 JVM 參數(shù)的默認(rèn)值。在這種情況下,jinfo
就能很方便地查看 JVM 參數(shù)的當(dāng)前值。
2.1 語法
jinfo [options] pid
其中,options
可以是以下選項之一:
-
-flags
:打印指定 JVM 的參數(shù)值。 -
-sysprops
:打印Java虛擬機(jī)的系統(tǒng)屬性。 -
-flag name
:打印指定名稱的標(biāo)志參數(shù)的值。 -
-flag [+|-]name
:打印或設(shè)置指定名稱的布爾標(biāo)志參數(shù)的值。
pid
是正在運(yùn)行的Java進(jìn)程的進(jìn)程ID。
2.2 示例
當(dāng)使用jinfo
命令來查看Java進(jìn)程的信息時,可以得到類似下面的輸出示例。以下是一些可能的輸出示例,根據(jù)您運(yùn)行的Java應(yīng)用程序和虛擬機(jī)配置,實際輸出可能會有所不同。
示例1:查看標(biāo)志參數(shù):
$ jinfo -flags 12345
Attaching to process ID 12345, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 11.0.12+7
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line: -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
VM Flags:
-XX:CICompilerCount=3
-XX:InitialHeapSize=268435456
-XX:MaxHeapSize=4294967296
-XX:MaxNewSize=1431306240
-XX:MinHeapDeltaBytes=524288
-XX:NewSize=89128960
-XX:OldSize=179306496
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseFastUnorderedTimeStamps
-XX:+UseParallelGC
示例 2:查看系統(tǒng)屬性:
$ jinfo -sysprops 12345
Attaching to process ID 12345, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 11.0.12+7
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line: -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Property settings:
awt.toolkit = sun.awt.windows.WToolkit
java.class.path = /path/to/your/application.jar
...
示例 3:查看特定標(biāo)志參數(shù)的值:
$ jinfo -flag UseG1GC 12345
Attaching to process ID 12345, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 11.0.12+7
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line: -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
UseG1GC=true
示例 4:修改特定標(biāo)志參數(shù)的值:
$ jinfo -flag +PrintGCDetails 12345
Attaching to process ID 12345, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 11.0.12+7
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=268435456
3、jstack
jstack
(Java Stack Trace)命令用于生成 Java 進(jìn)程的線程轉(zhuǎn)儲信息。它可以顯示每個線程的堆棧跟蹤,幫助您找出可能的死鎖、死循環(huán)和線程問題。
3.1 語法
jstack [ options ] pid
其中,options
是命令選項,pid
是目標(biāo) Java 進(jìn)程的進(jìn)程 ID。
以下是一些常用的命令選項:
-
-F
:強(qiáng)制生成線程堆棧,即使Java進(jìn)程沒有響應(yīng)。 -
-m
:除了線程堆棧,還包括每個線程的本地(本地方法)信息。 -
-l
:除了線程堆棧,還包括鎖信息。 -
-h
:顯示幫助信息。
3.2 示例
使用 jstack
命令分析線程問題。
假設(shè)您有一個 Java 應(yīng)用程序,出現(xiàn)了死鎖的情況。您可以使用 jstack
命令來分析線程問題。以下是一個示例:
-
首先,找到目標(biāo) Java 進(jìn)程的進(jìn)程 ID(pid),可以使用
jps
命令來查看正在運(yùn)行的Java進(jìn)程:jps
-
假設(shè)您找到了要分析的 Java 進(jìn)程的進(jìn)程 ID 為
12345
,使用jstack
命令來生成線程堆棧信息:jstack 12345
-
命令會輸出每個線程的調(diào)用棧信息,您可以在輸出中查找線程狀態(tài)、鎖信息等。
假設(shè)您的 Java 應(yīng)用程序中有兩個線程,一個正在等待鎖,而另一個持有該鎖。這可能導(dǎo)致死鎖。通過運(yùn)行 jstack
命令,您可以獲得類似以下的輸出:
"Thread-1" #10 prio=5 os_prio=0 tid=0x00007f36e8001000 nid=0x5303 waiting for monitor entry [0x00007f36e3100000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.example.MyClass.method1(MyClass.java:50)
- waiting to lock <0x00000000e3033c88> (a java.lang.Object)
at com.example.MyClass.run(MyClass.java:100)
"Thread-2" #11 prio=5 os_prio=0 tid=0x00007f36e8001800 nid=0x5304 waiting on condition [0x00007f36e300f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.example.MyClass.method2(MyClass.java:75)
at com.example.MyClass.run(MyClass.java:120)
在這個示例中,Thread-1
正在等待獲取一個鎖,而 Thread-2
在持有鎖的線程中等待。這可能是一個死鎖的跡象,您可以根據(jù)這些信息來分析并解決線程問題。
總之,jstack
命令是一個有用的工具,用于生成Java進(jìn)程的線程堆棧跟蹤信息,幫助您分析和解決應(yīng)用程序中的線程問題。
4、jmap
jmap
(Java Memory Map)命令用于生成 Java 進(jìn)程的內(nèi)存映射信息。它提供了堆的詳細(xì)信息,包括 Java 堆內(nèi)存、對象統(tǒng)計和內(nèi)存使用情況的詳細(xì)信息,可以幫助開發(fā)人員分析內(nèi)存泄漏、內(nèi)存使用情況等問題。
4.1 語法
jmap [options] <pid>
其中,options
是一些可選的命令選項,<pid>
是 Java 進(jìn)程的進(jìn)程 ID。
常用的 jmap
命令選項包括:
-
-heap
: 顯示Java堆內(nèi)存使用情況。 -
-histo
: 顯示Java堆內(nèi)存中的對象統(tǒng)計信息。 -
-dump:<format>=<file>
: 將堆內(nèi)存轉(zhuǎn)儲到文件,其中<format>
為轉(zhuǎn)儲格式(如b
,c
,hprof
),<file>
為目標(biāo)文件名。 -
-finalizerinfo
: 顯示等待終結(jié)者隊列中的對象。 -
-F
: 在無法連接到進(jìn)程時,強(qiáng)制執(zhí)行轉(zhuǎn)儲操作。
4.2 示例
示例1:使用jmap
命令分析 Java 堆內(nèi)存
假設(shè)您有一個 Java 應(yīng)用程序正在運(yùn)行,您想要分析其 Java 堆內(nèi)存使用情況,以便查找內(nèi)存泄漏問題。您可以使用以下命令:
jmap -heap <pid>
其中,<pid>
是 Java 應(yīng)用程序的進(jìn)程 ID。運(yùn)行上述命令后,jmap
會輸出 Java 堆內(nèi)存的使用情況,包括堆的大小、已使用內(nèi)存、空閑內(nèi)存等。
示例2:使用jmap
命令生成堆內(nèi)存轉(zhuǎn)儲文件
假設(shè)您懷疑 Java 應(yīng)用程序存在內(nèi)存泄漏,您可以使用 jmap
命令生成堆內(nèi)存轉(zhuǎn)儲文件,以便后續(xù)分析。以下是一個示例:
jmap -dump:format=b,file=heapdump.bin <pid>
在這個示例中,format=b
表示將轉(zhuǎn)儲以二進(jìn)制格式保存,file=heapdump.bin
指定轉(zhuǎn)儲文件名。您可以將 <pid>
替換為實際的 Java 進(jìn)程 ID。運(yùn)行此命令后,jmap
會生成一個名為 heapdump.bin
的轉(zhuǎn)儲文件,您可以使用其他工具進(jìn)行分析。
注意事項:
-
使用
jmap
命令時,建議在測試或開發(fā)環(huán)境中進(jìn)行,避免在生產(chǎn)環(huán)境中使用,因為生成堆內(nèi)存轉(zhuǎn)儲文件可能會影響應(yīng)用程序的性能。 -
jmap
命令可能需要JVM的調(diào)試權(quán)限,因此確保您有足夠的權(quán)限來運(yùn)行該命令。 -
轉(zhuǎn)儲文件可能會相當(dāng)大,特別是在內(nèi)存使用量較大的情況下。確保您有足夠的磁盤空間來存儲轉(zhuǎn)儲文件。
總之,jmap
命令是一個有用的工具,可以幫助開發(fā)人員分析 Java 應(yīng)用程序的內(nèi)存使用情況,查找內(nèi)存泄漏問題,并生成堆內(nèi)存轉(zhuǎn)儲文件以進(jìn)行后續(xù)分析。
5、jconsole
jconsole
(Java Monitoring and Management Console)是 Java 自帶的監(jiān)控和管理控制臺,它提供了一個圖形化界面,允許您監(jiān)視和管理正在運(yùn)行的 Java 應(yīng)用程序的性能和資源使用情況。jconsole
是一個非常有用的工具,可以幫助開發(fā)人員識別問題、進(jìn)行性能調(diào)優(yōu)和監(jiān)控Java應(yīng)用程序。
5.1 主要功能
-
實時監(jiān)控: 可以實時監(jiān)控 Java 應(yīng)用程序的內(nèi)存使用情況、線程狀態(tài)、垃圾回收、類加載等。
-
堆內(nèi)存分析: 提供了對堆內(nèi)存的監(jiān)控和分析,可以查看對象數(shù)量、內(nèi)存占用等信息。
-
線程分析: 可以幫助您檢查線程的狀態(tài)、堆棧跟蹤和 CPU 使用情況,幫助您發(fā)現(xiàn)死鎖和性能問題。
-
垃圾回收分析: 提供了垃圾回收的詳細(xì)信息,可以查看垃圾回收的頻率和效果。
-
MBean管理: 可以連接到 MBean(管理bean),允許您管理和監(jiān)控應(yīng)用程序的 MBean。
5.2 示例
以下是使用 jconsole 的示例,以監(jiān)控一個正在運(yùn)行的 Java 應(yīng)用程序:
-
啟動您的 Java 應(yīng)用程序。假設(shè)您的應(yīng)用程序是一個簡單的 Java 程序,例如:
public class MyApp { public static void main(String[] args) { while (true) { System.out.println("Running..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
-
打開終端并運(yùn)行以下命令,啟動
jconsole
:jconsole
-
在
jconsole
界面中,您可以看到一個列表,顯示了正在運(yùn)行的 Java 進(jìn)程。選擇您的應(yīng)用程序進(jìn)程并點擊“連接”。 -
在
jconsole
的不同選項卡中,您可以查看內(nèi)存使用情況、線程狀態(tài)、垃圾回收信息等。例如,您可以在“內(nèi)存”選項卡中查看堆內(nèi)存使用情況。 -
在“線程”選項卡中,您可以查看每個線程的狀態(tài)、堆棧跟蹤等信息,以幫助您識別潛在的線程問題。
jconsole
是一個強(qiáng)大的 Java 性能監(jiān)控和管理工具,提供了豐富的功能來監(jiān)視和分析應(yīng)用程序的性能和資源使用情況。通過jconsole
,開發(fā)人員可以輕松地識別問題、分析性能瓶頸,以及進(jìn)行調(diào)優(yōu),從而提升Java應(yīng)用程序的性能和效率。
6、VisualVM
Java VisualVM(Java Visual Monitoring and Troubleshooting Tool)是一款功能強(qiáng)大的多合一故障診斷和性能監(jiān)控的圖形化工具,它集成了多種性能統(tǒng)計工具的功能,使用它可以代替 jmap
、jstack
甚至 jconsole
。
它是 Java 開發(fā)工具包(JDK)的一部分,可以幫助您實時監(jiān)控應(yīng)用程序的各種指標(biāo),如內(nèi)存使用、線程情況、垃圾回收等,以便發(fā)現(xiàn)和解決性能問題。
6.1 主要功能
-
實時監(jiān)控: 允許您實時監(jiān)控Java應(yīng)用程序的運(yùn)行狀態(tài)。您可以查看內(nèi)存使用情況、線程狀態(tài)、CPU利用率等指標(biāo)。
-
內(nèi)存分析: 提供了內(nèi)存分析工具,可以幫助您識別內(nèi)存泄漏和對象分配情況。您可以查看堆內(nèi)存的內(nèi)容,分析對象引用關(guān)系。
-
線程分析: 可以監(jiān)控和分析應(yīng)用程序中的線程狀態(tài),幫助您發(fā)現(xiàn)死鎖、線程爭用等問題。
-
垃圾回收分析: 工具可以顯示垃圾回收的詳細(xì)信息,幫助您確定垃圾回收的類型、頻率和影響。
-
CPU分析: 可以幫助您分析 CPU 利用率高的原因,找出耗費 CPU 資源的部分。
-
多種插件: 支持各種插件,擴(kuò)展了其功能。您可以安裝插件來支持不同的 Java 應(yīng)用程序和特定的性能分析需求。
6.2 示例
監(jiān)控內(nèi)存和 CPU 使用。
-
啟動 Java VisualVM: 您可以在JDK的
bin
目錄中找到jvisualvm.exe
(Windows)或jvisualvm
(Linux/macOS)并運(yùn)行它。 -
連接到應(yīng)用程序: 在 Java VisualVM 中,點擊的“遠(yuǎn)程”按鈕,然后在“遠(yuǎn)程”面板中添加要連接的遠(yuǎn)程或本地Java進(jìn)程。
-
監(jiān)控性能: 連接到應(yīng)用程序后,您可以查看實時性能監(jiān)控信息,包括內(nèi)存、線程、CPU使用等。您還可以選擇不同的監(jiān)視選項,如“監(jiān)視”、“內(nèi)存”、“線程”等標(biāo)簽。
-
進(jìn)行內(nèi)存分析: 在“抽樣器”標(biāo)簽中,您可以生成并分析堆轉(zhuǎn)儲,查看對象引用關(guān)系、占用內(nèi)存的對象等。
-
線程分析和垃圾回收分析: 在“線程”和“監(jiān)視”標(biāo)簽中,您可以監(jiān)控線程狀態(tài)、識別死鎖,以及查看垃圾回收行為。
總之,Java VisualVM 是一個強(qiáng)大的性能分析工具,可以幫助您監(jiān)控、分析和優(yōu)化Java應(yīng)用程序的性能。通過實時監(jiān)控、內(nèi)存分析、線程分析等功能,您可以更深入地了解應(yīng)用程序的運(yùn)行情況,并解決性能問題。
7、總結(jié)
Java 性能分析是確保應(yīng)用程序優(yōu)化和效率的關(guān)鍵步驟。這些命令和工具提供了詳細(xì)的信息,可以幫助您分析和解決性能問題。無論您需要查找內(nèi)存泄漏、分析線程問題,還是優(yōu)化垃圾回收,這些工具都能夠提供有價值的信息。掌握這些命令和工具,將有助于您更好地管理和優(yōu)化您的Java應(yīng)用程序,提供更好的用戶體驗。文章來源:http://www.zghlxwxcb.cn/news/detail-660465.html
參考:文章來源地址http://www.zghlxwxcb.cn/news/detail-660465.html
- 《Java程序性能優(yōu)化:讓你的Java程序更快、更穩(wěn)定》
到了這里,關(guān)于Java性能分析中常用命令和工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!