http://blog.csdn.net/fenglibing/article/details/6411924
一、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被允許作網絡操作
二、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”,得到如下結果:
- num #instances #bytes class name
- ---------------------------------------------
- 1: 605348 68849960 [C
- 2: 1609734 51511488 java.util.concurrent.ConcurrentHashMap$Segment
- 3: 1610022 38640528 java.util.concurrent.locks.ReentrantLock$NonfairSync
- 4: 70784 31478168 [I
- 5: 218224 27628072 <constMethodKlass>
- 6: 1609734 26423552 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
- 7: 40379 24430792 [B
- 8: 218224 19211544 <methodKlass>
- 9: 602848 14468352 java.lang.String
- 10: 19374 11640184 <constantPoolKlass>
- 11: 236950 11451216 <symbolKlass>
- 12: 283746 11349840 java.util.concurrent.ConcurrentHashMap$ValueIterator
- 13: 19374 8826272 <instanceKlassKlass>
- 14: 100613 8048728 [Ljava.util.concurrent.ConcurrentHashMap$Segment;
- 15: 85036 7332664 [Ljava.lang.Object;
- 16: 15559 6614824 <constantPoolCacheKlass>
- 17: 78919 6313520 java.lang.reflect.Method
- 18: 103377 4962096 com.sun.tools.javac.zip.ZipFileIndexEntry
- 19: 51998 4324096 [Ljava.util.HashMap$Entry;
- 20: 100613 4024520 java.util.concurrent.ConcurrentHashMap
- 21: 157136 3771264 java.util.concurrent.ConcurrentHashMap$HashEntry
- 22: 35932 3736928 com.asiainfo.dbm.core.bean.monitor.FlowService
- 23: 35932 3736928 com.asiainfo.dbm.core.bean.monitor.FlowService
該命令通常用來分析內存泄漏OOM,通常做法是,首先配置JVM啓動參數,讓JVM在遇到OutOfMemoryError時自動生成Dump文件:
- -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path
然後使用命令:
- jmap -dump:format=b,file=/path/heap.bin 進程ID
如果只dump heap中的存活對象,則加上選項-live,如下:
- 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 — 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒)
一般比較常用的幾個參數是:
- 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的文件,文件內容如下:
- 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