Java自帶的性能監測工具用法簡介——jstack、jconsole、jinfo、jmap、jdb、jsta、jvisualvm

JDK內置工具使用html

1、javah命令(C Header and Stub File Generator)java

2、jps命令(Java Virtual Machine Process Status Tool)node

3、jstack命令(Java Stack Trace)linux

4、jstat命令(Java Virtual Machine Statistics Monitoring Tool)c++

5、jmap命令(Java Memory Map)windows

6、jinfo命令(Java Configuration Info)安全

7、jconsole命令(Java Monitoring and Management Console)服務器

8、jvisualvm命令(Java Virtual Machine Monitoring, Troubleshooting, and Profiling Tool)網絡

9、jhat命令(Java Heap Analyse Tool)oracle

10、Jdb命令(The Java Debugger)

一、介紹

jstack用於打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息,若是是在64位機器上,須要指定選項"-J-d64",Windows的jstack使用方式只支持如下的這種方式:

jstack [-l] pid

若是java程序崩潰生成core文件,jstack工具能夠用來得到core文件的java stack和native stack的信息,從而能夠輕鬆地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還能夠附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 若是如今運行的java程序呈現hung的狀態,jstack是很是有用的。

二、命令格式
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP

三、經常使用參數說明

1)、options: 

executable Java executable from which the core dump was produced.

(多是產生core dump的java可執行程序)

core 將被打印信息的core dump文件

remote-hostname-or-IP 遠程debug服務的主機名或ip

server-id 惟一id,假如一臺主機上多個遠程debug服務 

2)、基本參數:

-F當’jstack [-l] pid’沒有相應的時候強制打印棧信息

-l長列表. 打印關於鎖的附加信息,例如屬於java.util.concurrent的ownable synchronizers列表.

-m打印java和native c/c++框架的全部棧信息.

-h | -help打印幫助信息

pid 須要被打印配置信息的java進程id,能夠用jps查詢.

四、使用示例

 

 
1、jstatd 
啓動jvm監控服務。它是一個基於rmi的應用,向遠程機器提供本機jvm應用程序的信息。默認端口1099。 
實例:jstatd -J-Djava.security.policy=my.policy 

my.policy文件須要本身創建,內如以下: 
grant codebase "file:${java.home}/../lib/tools.jar" {  
 permission java.security.AllPermission;  
};  

這是安全策略文件,由於jdk對jvm作了jaas的安全檢測,因此咱們必須設置一些策略,使得jstatd被容許做網絡操做 

2、jps 
列出全部的jvm實例 
實例: 
jps 
列出本機全部的jvm實例 

jps 192.168.0.77 
列出遠程服務器192.168.0.77機器全部的jvm實例,採用rmi協議,默認鏈接端口爲1099 
(前提是遠程服務器提供jstatd服務) 

輸出內容以下: 
jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps 
6286 Jps 
6174  Jstat 

詳細請看鏈接:http://www.blogjava.net/aoxj/archive/2007/12/29/171447.html 

3、jconsole 

用法: jconsole [ -interval=n ] [ -notile ] [ -pluginpath  ] [ -version ] [ connection ...] 

  -interval   將更新間隔時間設置爲 n 秒(默認值爲 4 秒) 
  -notile     最初不平鋪顯示窗口(對於兩個或更多鏈接) 
  -pluginpath 指定 jconsole 用於查找插件的路徑 
  -version    輸出程序版本 

  connection = pid || host:port || JMX URL (service:jmx:://...) 

  pid       目標進程的進程 ID 
  host      遠程主機名或 IP 地址 
  port      用於遠程鏈接的端口號 

  -J          對正在運行 jconsole 的 Java 虛擬機指定輸入參數 

在cmd中輸入命令:jconsole 3980[java進程號] 彈出下圖 



4、jinfo 
用法: 
jinfo [ option ] pid 
jinfo [ option ] executable core 
jinfo [ option ] [server-id@]remote-hostname-or-IP 

參數: 

pid   進程號 
executable   產生core dump的java executable 
core   core file 
remote-hostname-or-IP  主機名或ip 
server-id    遠程主機上的debug server的惟一id 

選項: 
no option  打印命令行參數和系統屬性 
-flags  打印命令行參數 
-sysprops  打印系統屬性 
-h  幫助 

觀察運行中的java程序的運行環境參數:參數包括Java System屬性和JVM命令行參數 
實例: 
jinfo 2083 
其中2083就是java進程id號,能夠用jps獲得這個id號。我在windows上嘗試輸入這個命令,可是無論用,因而我輸入了下面這個命令: 
jinfo -flag MaxPermSize 3980 
顯示以下: 
-XX:MaxPermSize=67108864 

5、jstack 
該命令應該如何使用呢?首先須要用jstack命令產生java進程的dump文件,而後分析dump文件中的數據,下面的鏈接是一篇講述如何分析jstack產生的dump文件數據的文章,寫的很是不錯: 
http://www.blogjava.net/jzone/articles/303979.html 

6、jmap(linux下特有,也是很經常使用的一個命令) 
觀察運行中的jvm物理內存的佔用狀況。 
參數以下: 
-heap:打印jvm heap的狀況 
-histo:打印jvm heap的直方圖。其輸出信息包括類名,對象數量,對象佔用大小。 
-histo:live :同上,可是隻答應存活對象的狀況 
-permstat:打印permanent generation heap狀況 

命令使用: 
jmap -heap 2083 
能夠觀察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的內存使用狀況 

jmap -histo 2083 | jmap -histo:live 2083 
能夠觀察heap中全部對象的狀況(heap中全部生存的對象的狀況)。包括對象數量和所佔空間大小。 

jmap -histo java進程id 
能夠查看java進程中的全部實例、實例的個數,可用於查詢單例對象是否真的只生成了一個實例。 

在控制檯,輸入命令「jmap -histo 7329 > histo_dump」,獲得以下結果: 

Java代碼   收藏代碼
  1. num     #instances         #bytes  class name  
  2. ---------------------------------------------  
  3.   1:        605348       68849960  [C  
  4.   2:       1609734       51511488  java.util.concurrent.ConcurrentHashMap$Segment  
  5.   3:       1610022       38640528  java.util.concurrent.locks.ReentrantLock$NonfairSync  
  6.   4:         70784       31478168  [I  
  7.   5:        218224       27628072  <constMethodKlass>  
  8.   6:       1609734       26423552  [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;  
  9.   7:         40379       24430792  [B  
  10.   8:        218224       19211544  <methodKlass>  
  11.   9:        602848       14468352  java.lang.String  
  12.  10:         19374       11640184  <constantPoolKlass>  
  13.  11:        236950       11451216  <symbolKlass>  
  14.  12:        283746       11349840  java.util.concurrent.ConcurrentHashMap$ValueIterator  
  15.  13:         19374        8826272  <instanceKlassKlass>  
  16.  14:        100613        8048728  [Ljava.util.concurrent.ConcurrentHashMap$Segment;  
  17.  15:         85036        7332664  [Ljava.lang.Object;  
  18.  16:         15559        6614824  <constantPoolCacheKlass>  
  19.  17:         78919        6313520  java.lang.reflect.Method  
  20.  18:        103377        4962096  com.sun.tools.javac.zip.ZipFileIndexEntry  
  21.  19:         51998        4324096  [Ljava.util.HashMap$Entry;  
  22.  20:        100613        4024520  java.util.concurrent.ConcurrentHashMap  
  23.  21:        157136        3771264  java.util.concurrent.ConcurrentHashMap$HashEntry  
  24.  22:         35932        3736928  com.asiainfo.dbm.core.bean.monitor.FlowService  
  25.  23:         35932        3736928  com.asiainfo.dbm.core.bean.monitor.FlowService  



7、jstat 
最後要重點介紹下這個命令,這是jdk命令中比較重要,也是至關實用的一個命令,能夠觀察到classloader,compiler,gc相關信息。 
具體參數以下: 
-class:統計class loader行爲信息 
-compile:統計編譯行爲信息 
-gc:統計jdk gc時heap信息 
-gccapacity:統計不一樣的generations(不知道怎麼翻譯好,包括新生區,老年區,permanent區)相應的heap容量狀況 
-gccause:統計gc的狀況,(同-gcutil)和引發gc的事件 
-gcnew:統計gc時,新生代的狀況 
-gcnewcapacity:統計gc時,新生代heap容量 
-gcold:統計gc時,老年區的狀況 
-gcoldcapacity:統計gc時,老年區heap容量 
-gcpermcapacity:統計gc時,permanent區heap容量 
-gcutil:統計gc時,heap狀況 
-printcompilation:不知道幹什麼的,一直沒用過。 

通常比較經常使用的幾個參數是: 

Java代碼   收藏代碼
  1. jstat -class 27629 3000 10 //每隔1秒監控一次,一共作10次  


輸出內容含義以下: 

Loaded Bytes Unloaded Bytes Time
49955 49701.5    35528 32456.1      34.71
49955 49701.5    35528 32456.1      34.71
49955 49701.5    35528 32456.1      34.71
49955 49701.5    35528 32456.1      34.71
49963 49708.8    35528 32456.1      34.71
49963 49708.8    35528 32456.1      34.71
49963 49708.8    35528 32456.1      34.71
49971 49716.1    35528 32456.1      34.71
49971 49716.1    35528 32456.1      34.71
49971 49716.1    35528 32456.1      34.71



jstat -gc 2083 2000 20(每隔2秒監控一次,共作10) 
輸出內容含義以下: 

S0C Current survivor(存活的) space 0 capacity (KB).
EC Current eden space capacity (KB).
EU Eden space utilization (KB).
OC Current old space capacity (KB).
OU Old space utilization (KB).
PC Current permanent space capacity (KB).
PU Permanent space utilization (KB).
YGC Number of young generation GC Events.
YGCT Young generation garbage collection time.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.



監控內存使用狀況 參數 (查看內存溢出相對有用) 
jstat -gccause 2083 5000 (每隔5秒監控一次) 
輸出內容含義以下: 

S0 Survivor space 0 utilization as a percentage of the space's current capacity.
S1 Survivor space 1 utilization as a percentage of the space's current capacity.
E Eden space utilization as a percentage of the space's current capacity.
O Old space utilization as a percentage of the space's current capacity.
P Permanent space utilization as a percentage of the space's current capacity.
YGC Number of young generation GC events.
YGCT Young generation garbage collection time.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.
LGCC Cause of last Garbage Collection.
GCC Cause of current Garbage Collection.



8、jvisualvm 
java visualvm 是visualvm的一個針對java vm的發佈版本。 關於visualvm的更多信息能夠訪問 visualvm.java.net.jvisualvm 工具從jdk 6 update7 (apple的java 是從 mac os x 10.5 update 4)以後,默認就已經存在jdk工具裏。 
java visualvm是一個穩定的工具,用每個jdk發佈版本測試過。 最新的jdk請到oracle(sun)公司的網上進行下載。

jvisualvm 的功能及ui比jconsole還要強大。咱們先來看下jvisualvm的用法。 他是一個gui(圖形界面)的工具,因此上手應該會很快。 

官網上關於jvisualvm的用法介紹 http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html 

簡單來講,咱們不須要傳遞任何參數就能夠啓動jvisualvm。 

咱們能夠把jvisualvm也放到jdk的path裏, 而後加到環境的path裏。 這時候咱們在windows的運行或者cmd裏運行 
jvisualvm就能夠啓動該工具了。 或者咱們直接雙擊點擊該軟件 
在cmd中輸入命令:jvisualvm 彈出下圖 


具體用法能夠參考下面這個連接:http://www.iteye.com/topic/516447 

下面咱們來說解如何利用visualvm對遠程的主機進行監控 
首先,咱們能夠在用戶目錄下的任何地方(好比說:用戶根目錄,或者是jdk根目錄)新建一個名稱爲jstatd.all.policy的文件,文件內容以下: 

grant codebase "file:${java.home}/../lib/tools.jar" {     
  permission java.security.AllPermission;     
};  

新建完文件後,咱們給這個文件賦予執行權限,命令以下: 

chmod 755 jstatd.all.policy 

而後,咱們在咱們運行以下命令,啓動jstatd服務(jstatd服務的默認端口爲1099): 

jstatd -J-Djava.security.policy=/sw/bes/jstatd.all.policy  

記住jstatd.all.policy文件必須爲絕對路徑,防止出現java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)錯誤。 

最後,咱們能夠用jps命令查看是否啓動成功: 

jps -l  

獲得以下結果: 

    • 9481 com.bes.enterprise.ee.nodeagent.NodeAgentMain
    • 7329 com.bes.enterprise.server.Entry
    • 18968 com.bes.enterprise.server.Entry
    • 15802 sun.tools.jstatd.Jstatd
    • 16075 sun.tools.jps.Jps
    • 9328 com.bes.enterprise.server.Entry
相關文章
相關標籤/搜索