jstatd
啟動jvm監(jiān)控服務(wù)。它是一個基于rmi的應(yīng)用,向遠(yuǎn)程機(jī)器提供本機(jī)jvm應(yīng)用程序的信息。默認(rèn)端口1099。
實(shí)例:jstatd -J-Djava.security.policy=my.policy
my.policy文件需要自己建立,內(nèi)如如下:
grant codebase "file:$JAVA_HOME/lib/tools.jar" {
?permission java.security.AllPermission;
};
這是安全策略文件,因?yàn)閖dk對jvm做了jaas的安全檢測,所以我們必須設(shè)置一些策略,使得jstatd被允許作網(wǎng)絡(luò)操作
jps列出所有的jvm實(shí)例
實(shí)例:
jps
列出本機(jī)所有的jvm實(shí)例
jps 192.168.0.77
列出遠(yuǎn)程服務(wù)器192.168.0.77機(jī)器所有的jvm實(shí)例,采用rmi協(xié)議,默認(rèn)連接端口為1099
(前提是遠(yuǎn)程服務(wù)器提供jstatd服務(wù))
輸出內(nèi)容如下:
jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps
6286 Jps
6174? Jstat
jconsole一個圖形化界面,可以觀察到j(luò)ava進(jìn)程的gc,class,內(nèi)存等信息。雖然比較直觀,但是個人還是比較傾向于使用jstat命令(在最后一部分會對jstat作詳細(xì)的介紹)。
jinfo(linux下特有)
觀察運(yùn)行中的java程序的運(yùn)行環(huán)境參數(shù):參數(shù)包括Java System屬性和JVM命令行參數(shù)
實(shí)例:jinfo 2083
其中2083就是java進(jìn)程id號,可以用jps得到這個id號。
輸出內(nèi)容太多了,不在這里一一列舉,大家可以自己嘗試這個命令。
jstack(linux下特有)
可以觀察到j(luò)vm中當(dāng)前所有線程的運(yùn)行情況和線程當(dāng)前狀態(tài)
jstack 2083
輸出內(nèi)容如下:
jmap(linux下特有,也是很常用的一個命令)
觀察運(yùn)行中的jvm物理內(nèi)存的占用情況。
參數(shù)如下:
-heap:打印jvm heap的情況
-histo:打印jvm heap的直方圖。其輸出信息包括類名,對象數(shù)量,對象占用大小。
-histo:live :同上,但是只答應(yīng)存活對象的情況
-permstat:打印permanent generation heap情況
命令使用:
jmap -heap 2083
可以觀察到New Generation(Eden Space,F(xiàn)rom Space,To Space),tenured generation,Perm Generation的內(nèi)存使用情況
輸出內(nèi)容:

jmap -histo 2083 | jmap -histo:live 2083
可以觀察heap中所有對象的情況(heap中所有生存的對象的情況)。包括對象數(shù)量和所占空間大小。
輸出內(nèi)容:

寫個腳本,可以很快把占用heap最大的對象找出來,對付內(nèi)存泄漏特別有效。
jstat
最后要重點(diǎn)介紹下這個命令。
這是jdk命令中比較重要,也是相當(dāng)實(shí)用的一個命令,可以觀察到classloader,compiler,gc相關(guān)信息
具體參數(shù)如下:
-class:統(tǒng)計(jì)class loader行為信息
-compile:統(tǒng)計(jì)編譯行為信息
-gc:統(tǒng)計(jì)jdk gc時heap信息
-gccapacity:統(tǒng)計(jì)不同的generations(不知道怎么翻譯好,包括新生區(qū),老年區(qū),permanent區(qū))相應(yīng)的heap容量情況
-gccause:統(tǒng)計(jì)gc的情況,(同-gcutil)和引起gc的事件
-gcnew:統(tǒng)計(jì)gc時,新生代的情況
-gcnewcapacity:統(tǒng)計(jì)gc時,新生代heap容量
-gcold:統(tǒng)計(jì)gc時,老年區(qū)的情況
-gcoldcapacity:統(tǒng)計(jì)gc時,老年區(qū)heap容量
-gcpermcapacity:統(tǒng)計(jì)gc時,permanent區(qū)heap容量
-gcutil:統(tǒng)計(jì)gc時,heap情況
-printcompilation:不知道干什么的,一直沒用過。
一般比較常用的幾個參數(shù)是:
jstat -class 2083 1000 10 (每隔1秒監(jiān)控一次,一共做10次)
輸出內(nèi)容含義如下:
Loaded | Number of classes loaded. |
Bytes | Number of Kbytes loaded. |
Unloaded | Number of classes unloaded. |
Bytes | Number of Kbytes unloaded. |
Time | Time spent performing class load and unload operations. |
jstat -gc 2083 2000 20(每隔2秒監(jiān)控一次,共做10)
輸出內(nèi)容含義如下:
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. |
輸出內(nèi)容:

如果能熟練運(yùn)用這些命令,尤其是在linux下,那么完全可以代替jprofile等監(jiān)控工具了,誰讓它收費(fèi)呢。呵呵。
用命令的好處就是速度快,并且輔助于其他命令,比如grep gawk sed等,可以組裝多種符合自己需求的工具。