Java虛擬機學習總結(3)——JDK內置工具(jps、jstack、jmap、jstat)使用詳解

一、JDK內置工具 - javap

1、 介紹

java 反編譯工具,主要用於根據Java字節碼文件反彙編爲Java源代碼文件。

2、命令

javap <options> <classes>

3、命令集

 -help --help -? 輸出此用法消息
 -version 版本信息,其實是當前javap所在jdk的版本信息,不是class在哪個jdk下生成的。
 -v -verbose 輸出附加信息(包括行號、本地變量表,反彙編等詳細信息)
 -l 輸出行號和本地變量表
 -public 僅顯示公共類和成員
 -protected 顯示受保護的/公共類和成員
 -package 顯示程序包/受保護的/公共類 和成員 (默認)
 -p -private 顯示所有類和成員
 -c 對代碼進行反彙編
 -s 輸出內部類型簽名
 -sysinfo 顯示正在處理的類的系統信息 (路徑, 大小, 日期, MD5 散列)
 -constants 顯示靜態最終常量
 -classpath <path> 指定查找用戶類文件的位置
 -bootclasspath <path> 覆蓋引導類文件的位置

二、JDK內置工具 -jps

1、介紹

jps (Java Virtual Machine Process Status Tool) 顯示當前所有java金城pid的命令

2、命令

jps <options> <hostid>

3、命令集

-q 只輸出進程 ID
-m 輸出傳入 main 方法的參數
-l 輸出完全的包名,應用主類名,jar的完全路徑名
-v 輸出jvm參數
-V 輸出通過flag文件傳遞到JVM中的參數
-Joption 傳遞參數到vm,例如:-J-Xms512m

三、JDK內置工具 -jstat

1、介紹

jstat命令可以查看堆內存各部分的使用量,以及加載類的數量。

2、命令

jstat [generalOption | outputOptions vmid [ interval [ s|ms ] [ count ] ] ]

3、命令合集

-gc pid 顯示gc的信息,查看gc的次數,及時間
-gccapacity pid VM分代內存的使用和佔用大小
-gcutil pid 統計gc信息統計
-gcnew pid 年輕代對象的信息
-gcnewcapacity pid 年輕代對象的信息及其佔用量
-gcold pid old代對象的信息
-gcoldcapacity pid old代對象的信息
-gcpermcapacity pid perm對象的信息及其佔用量
-class pid 顯示加載class的數量,及所佔空間等信息
-compiler pid 顯示VM實時編譯的數量等信息
-printcompilation pid 當前VM執行的信息

四、JDK內置工具 - jcmd

1、介紹

看Java進程、導出線程信息、執行GC、還可以進行採樣分析(jmc 工具的飛行記錄器)。

2、命令

jcmd <pid | main class> <command ... | PerfCounter.print | -f file>

3、命令合集

 pid help 查看本地的java進程列表,獲取其pid
pid VM.uptime 查看 JVM 的啓動時長
pid GC.class_histogram 查看 JVM 的類信息,這個可以查看每個類的實例數量和佔用空間大小。
pid Thread.print 查看 JVM 的Thread Dump
pid GC.heap_dump FILE_NAME 查看 JVM 的Heap Dump,注意,如果只指定文件名,默認會生成在啓動 JVM 的目錄裏。
pid VM.system_properties 查看 JVM 的屬性信息
pid VM.flags 查看 JVM 的啓動參數,注意,可以看到 -X 和 -XX 的參數信息
pid VM.command_line 查看 JVM 的啓動命令行
pid GC.run_finalization 對 JVM 執行 java.lang.System.runFinalization(),儘量b別去調用這個對象的finalize方法。
pid GC.run 對 JVM 執行 java.lang.System.gc(),告訴垃圾收集器打算進行垃圾收集,而垃圾收集器進不進行收集是不確定的
PID PerfCounter.print 查看 JVM 的性能

五、JDK內置工具 -jinfo

1、介紹

主要用於打印配置信息,包括命令行參數、系統變量。極少數的情況下,我們可以用其來修改命令行參數。

2、命令

jinfo <option> <pid>

3、命令合集

-gc pid 顯示gc的信息,查看gc的次數,及時間
-gccapacity pid VM分代內存的使用和佔用大小
-gcutil pid 統計gc信息統計
-gcnew pid 年輕代對象的信息
-gcnewcapacity pid 年輕代對象的信息及其佔用量
-gcold pid old代對象的信息
-gcoldcapacity pid old代對象的信息
-gcpermcapacity pid perm對象的信息及其佔用量
-class pid 顯示加載class的數量,及所佔空間等信息
-compiler pid 顯示VM實時編譯的數量等信息
-printcompilation pid 當前VM執行的信息

六、JDK內置工具 - jcmd

1、介紹

看Java進程、導出線程信息、執行GC、還可以進行採樣分析(jmc 工具的飛行記錄器)。

2、命令

jcmd <pid | main class> <command ... | PerfCounter.print | -f file>

3、命令合集

參數說明
pid 對應jvm的進程id
executable core 產生core dump文件
[server-id@]remote server IP or hostname 遠程的ip或者hostname,server-id標記服務的唯一性id
option
no option 輸出全部的參數和系統屬性
-flag name 輸出對應名稱的參數
-flag [+|-]name 開啓或者關閉對應名稱的參數
-flag name=value 設定對應名稱的參數
-flags 輸出全部的參數
-sysprops 輸出系統屬性

七、JDK內置工具 -jinfo

1、介紹

主要用於打印配置信息,包括命令行參數、系統變量。極少數的情況下,我們可以用其來修改命令行參數。

2、命令

jinfo <option> <pid>

3、命令合集

-gc pid 顯示gc的信息,查看gc的次數,及時間
-gccapacity pid VM分代內存的使用和佔用大小
-gcutil pid 統計gc信息統計
-gcnew pid 年輕代對象的信息
-gcnewcapacity pid 年輕代對象的信息及其佔用量
-gcold pid old代對象的信息
-gcoldcapacity pid old代對象的信息
-gcpermcapacity pid perm對象的信息及其佔用量
-class pid 顯示加載class的數量,及所佔空間等信息
-compiler pid 顯示VM實時編譯的數量等信息
-printcompilation pid 當前VM執行的信息

八、JDK內置工具 - jhat

1、介紹

主要是用來分析java堆的命令,可以將堆中的對象以html的形式顯示出來,包括對象的數量,大小等等,並支持對象查詢語言。

2、命令

jhat [ options ] heap-dump-file

3、命令合集

-J< flag > 因爲 jhat 命令實際上會啓動一個JVM來執行, 通過 -J 可以在啓動JVM時傳入一些啓動參數. 例如, -J-Xmx512m 則指定運行 jhat 的Java虛擬機使用的最大堆內存爲 512 MB. 如果需要使用多個JVM啓動參數,則傳入多個 -Jxxxxxx
-stack false|true 關閉跟蹤對象分配調用堆棧。如果分配位置信息在堆轉儲中不可用. 則必須將此標誌設置爲 false. 默認值爲 true.
-refs false|true 關閉對象引用跟蹤。默認情況下, 返回的指針是指向其他特定對象的對象,如反向鏈接或輸入引用(referrers or incoming references), 會統計/計算堆中的所有對象。
-port port-number 設置 jhat HTTP server 的端口號. 默認值 7000。
-exclude exclude-file 指定對象查詢時需要排除的數據成員列表文件。 例如, 如果文件列出了 java.lang.String.value , 那麼當從某個特定對象 Object o 計算可達的對象列表時, 引用路徑涉及 java.lang.String.value 的都會被排除。
-baseline exclude-file 指定一個基準堆轉儲(baseline heap dump)。 在兩個 heap dumps 中有相同 object ID 的對象會被標記爲不是新的(marked as not being new). 其他對象被標記爲新的(new). 在比較兩個不同的堆轉儲時很有用。
-debug int 設置 debug 級別. 0 表示不輸出調試信息。 值越大則表示輸出更詳細的 debug 信息。
-version 啓動後只顯示版本信息就退出。

九、JDK內置工具 -jinfo

1、介紹

主要用於打印配置信息,包括命令行參數、系統變量。極少數的情況下,我們可以用其來修改命令行參數。

2、命令

jinfo <option> <pid>

3、命令合集

-gc pid 顯示gc的信息,查看gc的次數,及時間
-gccapacity pid VM分代內存的使用和佔用大小
-gcutil pid 統計gc信息統計
-gcnew pid 年輕代對象的信息
-gcnewcapacity pid 年輕代對象的信息及其佔用量
-gcold pid old代對象的信息
-gcoldcapacity pid old代對象的信息
-gcpermcapacity pid perm對象的信息及其佔用量
-class pid 顯示加載class的數量,及所佔空間等信息
-compiler pid 顯示VM實時編譯的數量等信息
-printcompilation pid 當前VM執行的信息

十、JDK內置工具 - jhat

1、介紹

打印出某個java進程(使用pid)內存內的,所有‘對象’的情況(如:產生那些對象,及其數量)。它的用途是爲了展示java進程的內存映射信息,或者堆內存詳情。

2、命令

jmap [ option ] pid (to connect to remote debug server) 
jmap [ option ] executable core (to connect to remote debug server) 
jmap [ option ] [server-id@]remote-hostname-or-IP (to connect to remote debug server) 

3、命令合集

-histo[:live] <pid> 通過histo選項,打印當前java堆中各個對象的數量、大小。如果添加了live,只會打印活躍的對象。
-dump:[live,]format=b,file=<filename> <pid> 通過-dump選項,把java堆中的對象dump到本地文件,然後使用MAT進行分析。
如果添加了live,只會dump活躍的對象。
-heap <pid> 通過-heap選項,打印java堆的配置情況和使用情況,還有使用的GC算法。
-finalizerinfo <pid> 通過-finalizerinfo選項,打印那些正在等待執行finalize方法的對象。
-permstat <pid> 通過-permstat選項,打印java堆永久代的信息,包括class loader相關的信息,和interned Strings的信息。

十一、JDK內置工具 - jhat

1、介紹

查看堆內各個部分的使用量,以及加載類的數量。使用時,需加上查看進程的進程id,和所選參數。

2、命令

jhat -options 

3、命令合集

十二、JDK內置工具 - jconsole

1、介紹

一個內置 Java 性能分析器,可以從命令行或在 GUI shell 中運行。您可以輕鬆地使用 JConsole(或者,它更高端的 “近親” VisualVM )來監控 Java 應用程序性能和跟蹤 Java 中的代碼。

2、命令

windows的bin目錄裏面

 

3、界面

 

 

查看,參看堆內存,非堆內存,內存池的狀況總體內存的分配和使用情況以及不同的GC進行垃圾回收的次數和時間。可以手動進行GC查看內存變化。在分析JAVA內存問題進行調優時候非常有用,你要學習JVM內存模型,之後會發現這裏的每個值都具有意義。 GC的算法和參數對性能有顯著的影響,注意垃圾回收次數、時間、以及partial GC和full GC,調整所使用的不同GC和以及各個GC下的參數,然後在這個視圖下觀察,以得到好的性能。現在流行微服務,同一個服務可能是多臺,所以這個命令更多的使用在測試環境單臺機器上。

十三、JDK內置工具 - jvisualvm

1、介紹

用來監控JVM的運行情況,可以用它來查看和瀏覽Heap Dump、Thread Dump、內存對象實例情況、GC執行情況、CPU消耗以及類的裝載情況

2、命令

windows的bin目錄裏面

3、 界面

 

VisualVM,能夠監控線程,內存情況,查看方法的CPU時間和內存中的對 象,已被GC的對象,反向查看分配的堆棧(如100個String對象分別由哪幾個對象分配出來的).從界面上看還是比較簡潔的,左邊是樹形結構,自動顯示當前本機所運行的Java程序,還可以添加遠程的Java VM,其中括號裏面的PID指的是進程ID。OverView界面顯示VM啓動參數以及該VM對應的一些屬性。Monitor界面則是監控Java堆大小,Permgen大小,Classes和線程數量。

 

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