JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta (Linux 如何查看进程的各线程的CPU占用 )
http://dolphin-ygj.iteye.com/blog/366216
JVM監控工具介紹jstack, jconsole, jinfo, jmap, jdb, jsta
- 博客分類:
- 調優
JVMJDKLinux多線程算法 JVM監控工具介紹
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
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. |
?
?
?
?
?
?
?
?
?
?
?
?
輸出內容:
?
?
?監控內存使用情況 參數 (查看內存溢出相對有用)
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. |
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
如果能熟練運用這些命令,尤其是在linux下,那么完全可以代替jprofile等監控工具了,誰讓它收費呢。呵呵。
用命令的好處就是速度快,并且輔助于其他命令,比如grep gawk sed等,可以組裝多種符合自己需求的工具。
jstack命令(Java Stack Trace)
分類: JAVA實用筆記 2011-05-11 14:49 3397人閱讀 評論(0) 收藏 舉報?
JDK內置工具使用
一、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進程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是非常有用的。
2、命令格式
jstack?[?option?]?pid
jstack?[?option?]?executable?core
jstack?[?option?]?[server-id@]remote-hostname-or-IP
3、常用參數說明
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查詢.
4、使用示例
?
http://dongyajun.iteye.com/blog/613352Linux 如何查看進程的各線程的CPU占用
- 博客分類:
- Linux
不過我們可以轉個彎,試試這樣做:
1 先用ps + grep找出該死的進程pid,比如 30420
2 top -H -p 30420,所有該進程的線程都列出來了。看看哪個線程pid占用最多,然后將這個pid轉換為16進制,如 44bf,注意要小寫
3 jstack 30420 | less,然后查找 nid=0x44bf,哦,找到了
Shell代碼 ?
p.s 嚴重提示:jstack操作有風險,使用虛謹慎,俺不止一次執行jstack操作導致jvm退出,不知為啥,rp啊rp。。。本來使用JMX會安全一些的,但是翻遍ThreadInfo的doc,沒有找到有關的方法
總結
以上是生活随笔為你收集整理的JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta (Linux 如何查看进程的各线程的CPU占用 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TIBCO STE(shared tec
- 下一篇: 风寒感冒和 风热感冒