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
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查詢.
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」,獲得以下結果:
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:不知道幹什麼的,一直沒用過。
通常比較經常使用的幾個參數是:
輸出內容含義以下:
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
獲得以下結果: