jstack?
-- 如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還可以附屬到正在運行的java程序中,看到 當時運行的java程序的java stack和native stack的信息, 如果現在運行的java程序呈現hung的狀態,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。
jconsole?
– jconsole是基于
Java
?Management Extensions (JMX)的實時圖形化監測工具,這個工具利用了內建到JVM里面的JMX指令來提供實時的性能和資源的監控,包括了
Java
程序的內存使用,Heap size, 線程的狀態,類的分配狀態和空間使用等等。
jinfo?
– jinfo可以從core文件里面知道崩潰的Java應用程序的配置信息,目前只有在Solaris和Linux的JDK版本里面才有。
jmap?
– jmap 可以從core文件或進程中獲得內存的具體匹配情況,包括Heap size, Perm size等等,目前只有在Solaris和Linux的JDK版本里面才有。
jdb?
– jdb 用來對core文件和正在運行的Java進程進行實時地調試,里面包含了豐富的命令幫助您進行調試,它的功能和Sun studio里面所帶的dbx非常相似,但 jdb是專門用來針對Java應用程序的。
jstat?
– jstat利用了JVM內建的指令對Java應用程序的資源和性能進行實時的命令行的監控,包括了對Heap size和垃圾回收狀況的監控等等。
jps?
– jps是用來查看JVM里面所有進程的具體狀態, 包括進程ID,進程啟動的路徑等等。?
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被允許作網絡操作
上面的操作沒有通過,出現:
Could not create remote object
access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.System.setProperty(System.java:727)
at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)
create in your usr/java/bin the jstatd.all.policy file, with the content must be
-
grant?codebase?"file:${java.home}/../lib/tools.jar"?{ ?
-
permission?java.security.AllPermission; ?
-
};?
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
jconsole
一個圖形化界面,可以觀察到java進程的gc,class,內存等信息。雖然比較直觀,但是個人還是比較傾向于使用jstat命令(在最后一部分會對jstat作詳細的介紹)。
jinfo
(linux下特有)
觀察運行中的java程序的運行環境參數:參數包括Java System屬性和JVM命令行參數
實例:jinfo 2083
其中2083就是java進程id號,可以用jps得到這個id號。
輸出內容太多了,不在這里一一列舉,大家可以自己嘗試這個命令。
jstack
(linux下特有)
可以觀察到jvm中當前所有線程的運行情況和線程當前狀態
jstack 2083
輸出內容如下:
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中所有生存的對象的情況)。包括對象數量和所占空間大小。
輸出內容:
寫個腳本,可以很快把占用heap最大的對象找出來,對付內存泄漏特別有效。
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:不知道干什么的,一直沒用過。
一般比較常用的幾個參數是:
jstat -class 2083 1000 10 (每隔1秒監控一次,一共做10次)
輸出內容含義如下:
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秒監控一次,共做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.
|
輸出內容:
如果能熟練運用這些命令,尤其是在linux下,那么完全可以代替jprofile等監控工具了,誰讓它收費呢。呵呵。
用命令的好處就是速度快,并且輔助于其他命令,比如grep gawk sed等,可以組裝多種符合自己需求的工具。
u
??????????????
jps
的用法
用來查看
JVM
里面所有進程的具體狀態
,?
包括進程
ID
,進程啟動的路徑等等。
與
unix
上的
ps
類似,用來顯示本地的
java
進程,可以查看本地運行著幾個
java
程序,并顯示他們的進程號。
?
[root@localhost ~]# jps
25517 Jps
25444 Bootstrap
?
?
?
linux查看進程的線程信息
2011-07-28 18:46
查看Java的線程
1、用ps -eLf | grep java | wc 查看系統里運行的java線程數
2、用top H可以按線程排序CPU和內存的占用及相應的線程ID
3、用killall -3 (unix only) 或 jstack -l 可以Dump出Java的線程,然后根據線程ID(轉換成16進制后對應thread dump的nid)查看線程的堆棧
?
linux查看進程對應的線程信息
ps -Lf pid
?
查看進程對應線程個數
ps -Lf pid|wc
?
對于java程序也可以通過jvisualvm查看
?
其他:
查看最大線程數
max user processes (-u) 10111
?
查看最大進程數:
cat?/proc/sys/kernel/threads-max
?
?
|
http://hi.baidu.com/mengxiangjava/blog/item/70556453cd40b1838d543038.html
JVM監控工具介紹jstack, jconsole, jinfo, jmap, jdb, jsta