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

在開始介紹之前,先介紹幾篇寫的比較詳細的博客,咱們不求最精,一定最全,最省事。 
http://blog.csdn.net/fenglibing/article/details/6411924 
一、jstatd 
啓動jvm監控服務。它是一個基於rmi的應用,向遠程機器提供本機jvm應用程序的信息。默認端口1099。 
實例:jstatd -J-Djava.security.policy=my.policy 

my.policy文件需要自己建立,內如如下: 
Java代碼  收藏代碼
  1. grant codebase "file:${java.home}/../lib/tools.jar" {  
  2.  permission java.security.AllPermission;  
  3. };  

這是安全策略文件,因爲jdk對jvm做了jaas的安全檢測,所以我們必須設置一些策略,使得jstatd被允許作網絡操作 

二、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 

三、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進程號] 彈出下圖 


四、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 

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

命令格式: 
jstack [ option ] pid 
基本參數: 
-F當’jstack [-l] pid’沒有相應的時候強制打印棧信息 
-l長列表. 打印關於鎖的附加信息,例如屬於java.util.concurrent的ownable synchronizers列表. 
-m打印java和native c/c++框架的所有棧信息. 
-h | -help打印幫助信息 
pid 需要被打印配置信息的java進程id,可以用jps查詢. 

具體用法 
jstack -l 進程ID 


六、jmap(linux下特有,也是很常用的一個命令) 
觀察運行中的jvm物理內存的佔用情況。 
Usage: 
    jmap [option] <pid> 
        (to connect to running process) 
    jmap [option] <executable <core> 
        (to connect to a core file) 
    jmap [option] [server_id@]<remote server IP or hostname> 
        (to connect to remote debug server) 

where <option> is one of: 
    <none>               to print same info as Solaris pmap 
    -heap                to print java heap summary 
    -histo[:live]        to print histogram of java object heap; if the "live" 
                         suboption is specified, only count live objects 
    -permstat            to print permanent generation statistics 
    -finalizerinfo       to print information on objects awaiting finalization 
    -dump:<dump-options> to dump java heap in hprof binary format 
                         dump-options: 
                           live         dump only live objects; if not specified, 
                                        all objects in the heap are dumped. 
                           format=b     binary format 
                           file=<file>  dump heap to <file> 
                         Example: jmap -dump:live,format=b,file=heap.bin <pid> 
    -F                   force. Use with -dump:<dump-options> <pid> or -histo 
                         to force a heap dump or histogram when <pid> does not 
                         respond. The "live" suboption is not supported 
                         in this mode. 
    -h | -help           to print this help message 
    -J<flag>             to pass <flag> directly to the runtime system
 
參數如下: 
-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  

該命令通常用來分析內存泄漏OOM,通常做法是,首先配置JVM啓動參數,讓JVM在遇到OutOfMemoryError時自動生成Dump文件: 
Java代碼  收藏代碼
  1. -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path  

然後使用命令: 
Java代碼  收藏代碼
  1. jmap  -dump:format=b,file=/path/heap.bin 進程ID     

如果只dump heap中的存活對象,則加上選項-live,如下: 
Java代碼  收藏代碼
  1. jmap  -dump:live,format=b,file=/path/heap.bin 進程ID  

最後在eclipse中安裝MAT插件(http://www.eclipse.org/mat/),然後在eclipse中,file---->open,打開這個文件heap.bin,利用現成的OOM工具進行分析。具體操作方法:首先輸入網址http://www.eclipse.org/mat/previousReleases.php,然後查看你自己的Eclipse版本,我的是Indigo的,所以點擊鏈接“Previous Releases”,選擇Indigo版本的URLhttp://download.eclipse.org/mat/1.1.0/update-site/ 

七、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:不知道幹什麼的,一直沒用過。
 

語法結構:  
  
Usage: jstat -help|-options  
  
       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]  
  
參數解釋:  
  
Options — 選項,我們一般使用 -gcutil 查看gc情況  
  
vmid    — VM的進程號,即當前運行的java進程號  
  
interval– 間隔時間,單位爲秒或者毫秒  
  
count   — 打印次數,如果缺省則打印無數次  
  
S0  — Heap上的 Survivor space 0 區已使用空間的百分比  
S1  — Heap上的 Survivor space 1 區已使用空間的百分比  
E   — Heap上的 Eden space 區已使用空間的百分比  
O   — Heap上的 Old space 區已使用空間的百分比  
P   — Perm space 區已使用空間的百分比  
YGC — 從應用程序啓動到採樣時發生 Young GC 的次數  
YGCT– 從應用程序啓動到採樣時 Young GC 所用的時間(單位秒)  
FGC — 從應用程序啓動到採樣時發生 Full GC 的次數  
FGCT– 從應用程序啓動到採樣時 Full GC 所用的時間(單位秒)  
GCT — 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒) 

一般比較常用的幾個參數是: 
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.

  
jstat -gcutil 25444  
  
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT  
  
11.63   0.00   56.46  66.92  98.49 162    0.248    6      0.331    0.579  

  
jstat -gcutil 25444 1000 5 (25444是java的進程號,ps -ef | grep java)  
  
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT  
  
73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583  
  
73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583  
  
73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583  
  
73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583  
  
73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583 

八、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的文件,文件內容如下: 
Java代碼  收藏代碼
  1. grant codebase "file:${java.home}/../lib/tools.jar" {     
  2.   permission java.security.AllPermission;     
  3. };  


新建完文件後,我們給這個文件賦予執行權限,命令如下: 
Java代碼  收藏代碼
  1. chmod 755 jstatd.all.policy  


然後,我們在我們運行如下命令,啓動jstatd服務(jstatd服務的默認端口爲1099): 
Java代碼  收藏代碼
  1. 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命令查看是否啓動成功: 
Java代碼  收藏代碼
  1. 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
  • 大小: 115.3 KB
  • 大小: 114 KB
  • 大小: 98.9 KB
  • 大小: 98.4 KB
  • 大小: 190.5 KB
  • 大小: 55.4 KB
發佈了27 篇原創文章 · 獲贊 20 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章