jdk分析工具:jps和jstack


jps

用來查看基於HotSpot JVM里面所有進程的具體狀態包括進程ID,進程啟動的路徑等等。與unix上的ps類似,用來顯示本地有權限的java進程,可以查看本地運行着幾個java程序,並顯示他們的進程號。使用jps時,不需要傳遞進程號做為參數。

Jps也可以顯示遠程系統上的JAVA進程,這需要遠程服務上開啟了jstat服務,以及RMI注及服務,不過常用都是對本對的JAVA進程的查看。

命令格式

jps [ options ] [ hostid ]

常用參數說明

-m 輸出傳遞給main方法的參數,如果是內嵌的JVM則輸出為null

-l 輸出應用程序主類的完整包名,或者是應用程序JAR文件的完整路徑。

-v 輸出傳給JVM的參數。

使用示例

blue@blue-pc:~$ jps
8710 Jps
5661 Bootstrap
2491 
2967 
blue@blue-pc:~$ jps -ml
5661 org.apache.catalina.startup.Bootstrap start
2491 
8724 sun.tools.jps.Jps -ml
2967 
blue@blue-pc:~$ jps -mlv
5661 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/home/blue/apache-tomcat-7.0.39/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/home/blue/apache-tomcat-7.0.39/endorsed -Dcatalina.base=/home/blue/apache-tomcat-7.0.39 -Dcatalina.home=/home/blue/apache-tomcat-7.0.39 -Djava.io.tmpdir=/home/blue/apache-tomcat-7.0.39/temp
2491  -Dosgi.requiredJavaVersion=1.5 -XX:MaxPermSize=256m -Xms40m -Xmx384m
8738 sun.tools.jps.Jps -mlv -Dapplication.home=/usr/local/jdk1.6.0_35 -Xms8m
2967  -Dosgi.requiredJavaVersion=1.5 -XX:MaxPermSize=256m -Xms40m -Xmx512m

前面的數字是jvm的進程id,后面是jvm的類啟動信息。

 

jstack

如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stacknative stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java stacknative stack的信息如果現在運行的java程序呈現hung的狀態,jstack是非常有用的。

 

命令格式

$jstack [ option ] pid

$jstack [ option ] executable core

$jstack [ option ] [server-id@]remote-hostname-or-IP

 

常用參數說明

OPTIONS


-F jstack [-l] pid無法響應時,強制打印堆棧

-l l長列表. 打印關於鎖的附加信息,例如屬於java.util.concurrent的ownable synchronizers列表.

-m 混合模式輸出(包括java和本地c/c++片段)堆棧。

pid: java應用程序的進程號,一般可以通過jps來獲得;

executable:產生core dump的java可執行程序;

core:打印出的core文件;

remote-hostname-or-ip:遠程debug服務器的名稱或IP;

server-id: 唯一id,假如一台主機上多個遠程debug服務;

 

使用示例

blue@blue-pc:~$ jps -ml
5661 org.apache.catalina.startup.Bootstrap 
blue@blue-pc:~$ jstack 5661
2013-04-16 21:09:27
Full thread dump Java HotSpot(TM) Server VM (20.10-b01 mixed mode):

"Attach Listener" daemon prio=10 tid=0x70e95400 nid=0x2265 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"http-bio-8080-exec-20" daemon prio=10 tid=0x08a35800 nid=0x1d42 waiting on condition [0x70997000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x766a27b8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:662)
........

一般情況下,通過jstack輸出的線程信息主要包括:jvm自身線程、用戶線程等。其中jvm線程會在jvm啟動時就會存在。對於用戶線程則是在用戶訪問時才會生成。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM