JDK内置工具使用
JDK內(nèi)置工具使用
一、javah命令(C?Header?and?Stub?File?Generator)
二、jps命令(Java?Virtual?Machine?Process?Status?Tool)
三、jstack命令(Java?Stack?Trace)
四、jstat命令(Java?Virtual?Machine?Statistics?Monitoring?Tool)
五、jmap命令(Java?Memory?Map)
六、jinfo命令(Java?Configuration?Info)
七、jconsole命令(Java?Monitoring?and?Management?Console)
八、jvisualvm命令(Java?Virtual?Machine?Monitoring,?Troubleshooting,?and?Profiling?Tool)
九、jhat命令(Java?Heap?Analyse?Tool)
十、Jdb命令(The?Java?Debugger)
1、介紹
jstack用于打印出給定的java進(jìn)程ID或core?file或遠(yuǎn)程調(diào)試服務(wù)的Java堆棧信息,如果是在64位機(jī)器上,需要指定選項(xiàng)"-J-d64",Windows的jstack使用方式只支持以下的這種方式:
jstack?[-l]?pid
如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java?stack和native?stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發(fā)生問題。另外,jstack工具還可以附屬到正在運(yùn)行的java程序中,看到當(dāng)時(shí)運(yùn)行的java程序的java?stack和native?stack的信息,?如果現(xiàn)在運(yùn)行的java程序呈現(xiàn)hung的狀態(tài),jstack是非常有用的。
2、命令格式
jstack?[?option?]?pid
jstack?[?option?]?executable?core
jstack?[?option?]?[server-id@]remote-hostname-or-IP
3、常用參數(shù)說明
1)、options:?
executable?Java?executable?from?which?the?core?dump?was?produced.
(可能是產(chǎn)生core?dump的java可執(zhí)行程序)
core?將被打印信息的core?dump文件
remote-hostname-or-IP?遠(yuǎn)程debug服務(wù)的主機(jī)名或ip
server-id?唯一id,假如一臺主機(jī)上多個(gè)遠(yuǎn)程debug服務(wù)?
2)、基本參數(shù):
-F當(dāng)’jstack?[-l]?pid’沒有相應(yīng)的時(shí)候強(qiáng)制打印棧信息
-l長列表.?打印關(guān)于鎖的附加信息,例如屬于java.util.concurrent的ownable?synchronizers列表.
-m打印java和native?c/c++框架的所有棧信息.
-h?|?-help打印幫助信息
pid?需要被打印配置信息的java進(jìn)程id,可以用jps查詢.
4、使用示例
一、jstatd?
啟動jvm監(jiān)控服務(wù)。它是一個(gè)基于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)如如下:?
Java代碼??
這是安全策略文件,因?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?
詳細(xì)請看連接:http://www.blogjava.net/aoxj/archive/2007/12/29/171447.html?
三、jconsole?
用法: jconsole [ -interval=n ] [ -notile ] [ -pluginpath? ] [ -version ] [ connection ...]?
? -interval?? 將更新間隔時(shí)間設(shè)置為 n 秒(默認(rèn)值為 4 秒)?
? -notile???? 最初不平鋪顯示窗口(對于兩個(gè)或更多連接)?
? -pluginpath 指定 jconsole 用于查找插件的路徑?
? -version??? 輸出程序版本?
? connection = pid || host:port || JMX URL (service:jmx:://...)?
? pid?????? 目標(biāo)進(jìn)程的進(jìn)程 ID?
? host????? 遠(yuǎn)程主機(jī)名或 IP 地址?
? port????? 用于遠(yuǎn)程連接的端口號?
? -J????????? 對正在運(yùn)行 jconsole 的 Java 虛擬機(jī)指定輸入?yún)?shù)?
在cmd中輸入命令:jconsole 3980[java進(jìn)程號] 彈出下圖?
四、jinfo?
用法:?
jinfo [ option ] pid?
jinfo [ option ] executable core?
jinfo [ option ] [server-id@]remote-hostname-or-IP?
參數(shù):?
pid?? 進(jìn)程號?
executable?? 產(chǎn)生core dump的java executable?
core?? core file?
remote-hostname-or-IP? 主機(jī)名或ip?
server-id??? 遠(yuǎn)程主機(jī)上的debug server的唯一id?
選項(xiàng):?
no option? 打印命令行參數(shù)和系統(tǒng)屬性?
-flags? 打印命令行參數(shù)?
-sysprops? 打印系統(tǒng)屬性?
-h? 幫助?
觀察運(yùn)行中的java程序的運(yùn)行環(huán)境參數(shù):參數(shù)包括Java System屬性和JVM命令行參數(shù)?
實(shí)例:?
jinfo 2083?
其中2083就是java進(jìn)程id號,可以用jps得到這個(gè)id號。我在windows上嘗試輸入這個(gè)命令,但是不管用,于是我輸入了下面這個(gè)命令:?
jinfo -flag MaxPermSize 3980?
顯示如下:?
-XX:MaxPermSize=67108864?
五、jstack?
該命令應(yīng)該如何使用呢?首先需要用jstack命令產(chǎn)生java進(jìn)程的dump文件,然后分析dump文件中的數(shù)據(jù),下面的連接是一篇講述如何分析jstack產(chǎn)生的dump文件數(shù)據(jù)的文章,寫的非常不錯(cuò):?
http://www.blogjava.net/jzone/articles/303979.html?
六、jmap(linux下特有,也是很常用的一個(gè)命令)?
觀察運(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,From Space,To Space),tenured generation,Perm Generation的內(nèi)存使用情況?
jmap -histo 2083 | jmap -histo:live 2083?
可以觀察heap中所有對象的情況(heap中所有生存的對象的情況)。包括對象數(shù)量和所占空間大小。?
jmap -histo java進(jìn)程id?
可以查看java進(jìn)程中的所有實(shí)例、實(shí)例的個(gè)數(shù),可用于查詢單例對象是否真的只生成了一個(gè)實(shí)例。?
在控制臺,輸入命令“jmap -histo 7329 > histo_dump”,得到如下結(jié)果:?
Java代碼??
七、jstat?
最后要重點(diǎn)介紹下這個(gè)命令,這是jdk命令中比較重要,也是相當(dāng)實(shí)用的一個(gè)命令,可以觀察到classloader,compiler,gc相關(guān)信息。?
具體參數(shù)如下:?
-class:統(tǒng)計(jì)class loader行為信息?
-compile:統(tǒng)計(jì)編譯行為信息?
-gc:統(tǒng)計(jì)jdk gc時(shí)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時(shí),新生代的情況?
-gcnewcapacity:統(tǒng)計(jì)gc時(shí),新生代heap容量?
-gcold:統(tǒng)計(jì)gc時(shí),老年區(qū)的情況?
-gcoldcapacity:統(tǒng)計(jì)gc時(shí),老年區(qū)heap容量?
-gcpermcapacity:統(tǒng)計(jì)gc時(shí),permanent區(qū)heap容量?
-gcutil:統(tǒng)計(jì)gc時(shí),heap情況?
-printcompilation:不知道干什么的,一直沒用過。?
一般比較常用的幾個(gè)參數(shù)是:?
Java代碼??
輸出內(nèi)容含義如下:?
| 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秒監(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. |
監(jiān)控內(nèi)存使用情況 參數(shù) (查看內(nèi)存溢出相對有用)?
jstat -gccause 2083 5000?(每隔5秒監(jiān)控一次)?
輸出內(nèi)容含義如下:?
| 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. |
八、jvisualvm?
java visualvm 是visualvm的一個(gè)針對java vm的發(fā)布版本。 關(guān)于visualvm的更多信息可以訪問 visualvm.java.net.jvisualvm 工具從jdk 6 update7 (apple的java 是從 mac os x 10.5 update 4)之后,默認(rèn)就已經(jīng)存在jdk工具里。?
java visualvm是一個(gè)穩(wěn)定的工具,用每一個(gè)jdk發(fā)布版本測試過。 最新的jdk請到oracle(sun)公司的網(wǎng)上進(jìn)行下載。
jvisualvm 的功能及ui比jconsole還要強(qiáng)大。我們先來看下jvisualvm的用法。 他是一個(gè)gui(圖形界面)的工具,所以上手應(yīng)該會很快。?
官網(wǎng)上關(guān)于jvisualvm的用法介紹 http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html?
簡單來說,我們不需要傳遞任何參數(shù)就可以啟動jvisualvm。?
我們可以把jvisualvm也放到j(luò)dk的path里, 然后加到環(huán)境的path里。 這時(shí)候我們在windows的運(yùn)行或者cmd里運(yùn)行?
jvisualvm就可以啟動該工具了。 或者我們直接雙擊點(diǎn)擊該軟件?
在cmd中輸入命令:jvisualvm 彈出下圖?
具體用法可以參考下面這個(gè)鏈接:http://www.iteye.com/topic/516447?
下面我們來講解如何利用visualvm對遠(yuǎn)程的主機(jī)進(jìn)行監(jiān)控?
首先,我們可以在用戶目錄下的任何地方(比如說:用戶根目錄,或者是jdk根目錄)新建一個(gè)名稱為jstatd.all.policy的文件,文件內(nèi)容如下:?
Java代碼??
新建完文件后,我們給這個(gè)文件賦予執(zhí)行權(quán)限,命令如下:?
Java代碼??
然后,我們在我們運(yùn)行如下命令,啟動jstatd服務(wù)(jstatd服務(wù)的默認(rèn)端口為1099):?
Java代碼??
記住jstatd.all.policy文件必須為絕對路徑,防止出現(xiàn)java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)錯(cuò)誤。?
最后,我們可以用jps命令查看是否啟動成功:?
Java代碼??
得到如下結(jié)果:?
- 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
總結(jié)
- 上一篇: java内存溢出分析工具:jmap使用实
- 下一篇: 使用了JDK自带的jconsole查看T