天天看點

java 程式故障常用排查工具

http://guafei.iteye.com/blog/1815222 (jstack(檢視線程)、jmap(檢視記憶體)和jstat(性能分析)指令)

1、jps 指令:

      jps [ options ] [ hostid ] 

options選項 

-q 僅輸出VM辨別符,不包括class name,jar name,arguments in main method 

-m 輸出main method的參數 

-l 輸出完全的包名,應用主類名,jar的完全路徑名 

-v 輸出jvm參數 

-V 輸出通過flag檔案傳遞到JVM中的參數(.hotspotrc檔案或-XX:Flags=所指定的檔案 

-J 用于傳遞jvm選項到由javac調用的java加載器中,例如,“-J-Xms48m”将把啟動記憶體設定為48M,使用-J選項可以非常友善的向基于Java的開發的底層虛拟機應用程式傳遞參數。

 hostid 指定了目标的伺服器,它的文法如下:

[protocol:][[//]hostname][:port][/servername]

protocol - 如果protocol及hostname都沒有指定,那表示的是與目前環境相關的本地協定,如果指定了hostname卻沒有指定protocol,那麼protocol的預設就是rmi。

hostname - 伺服器的IP或者名稱,沒有指定則表示本機。

port - 遠端rmi的端口,如果沒有指定則預設為1099。

Servername - 注冊到RMI注冊中心中的jstatd的名稱。

示例

不帶任何參數

[[email protected] /]# jps

23501 Bootstrap

23709 Jps

帶-v參數

[[email protected] /]# jps -v

23501 Bootstrap -Djava.util.logging.config.file=/opt/apache-tomcat-7.0.67/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Xms1024m -Xmx1024m -Xss1m -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=256M -XX:MaxPermSize=512m -XX:+DisableExplicitGC -Xms1024m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.endorsed.dirs=/opt/apache-tomcat-7.0.67/endorsed -Dcatalina.base=/opt/apache-tomcat-7.0.67 -Dcatalina.home=/opt/apache-tomcat-7.0.67 -Djava.io.tmpdir=/opt/apache-tomcat-7.0.67/temp

23729 Jps -Denv.class.path=.:/usr/java/jdk1.7.0_75/lib:/usr/java/jdk1.7.0_75/jre/lib: -Dapplication.home=/usr/java/jdk1.7.0_75 -Xms8m

帶-l參數

[[email protected] /]# jps -l

23501 org.apache.catalina.startup.Bootstrap

23751 sun.tools.jps.Jps

2、jstat指令  (jstack(檢視線程)、jmap(檢視記憶體)和jstat(性能分析)指令 參考)

Jstat是JDK自帶的一個輕量級小工具。全稱“Java Virtual Machine statistics monitoring tool”,它位于java的bin目錄下,主要利用JVM内建的指令對Java應用程式的資源和性能進行實時的指令行的監控,包括了對Heap size和垃圾回收狀況的監控。可見,Jstat是輕量級的、專門針對JVM的工具,非常适用。

jstat工具特别強大,有衆多的可選項,詳細檢視堆内各個部分的使用量,以及加載類的數量。使用時,需加上檢視程序的程序id(使用jps檢視),和所選參數。參考格式如下:

jstat [ option vmid [ interval[s|ms] [count] ] ]

參數interval和count代表查詢間隔和查詢次數,可以列出目前JVM版本支援的選項,常見的有

l class (類加載器) 

l compiler (JIT) 

l gc (GC堆狀态) 

l gccapacity (各區大小) 

l gccause (最近一次GC統計和原因) 

l gcnew (新區統計) 

l gcnewcapacity (新區大小) 

l gcold (老區統計) 

l gcoldcapacity (老區大小) 

l gcpermcapacity (永久區大小) 

l gcutil (GC統計彙總) 

l printcompilation (HotSpot編譯統計)

比如:jstat -gc java程序号

[[email protected] /]# jstat -gc 23915

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   

65536.0 65536.0  0.0   50941.4 393216.0 354346.7  524288.0   17374.8   262144.0 51252.2      3    0.160   0      0.000    0.160

3、jinfo 指令

   jinfo主要用來檢視應用的配置參數,及列印JVM所指定的JVM參數;還可以使用 -sysprops 選項講虛拟機程序中所指定的System.getProperties()内容列印出來;并可以檢視到JVM參數的系統預設值,這個在jps -v是無法看到的;同時jinfo 還能在運作期修改JVM參數, 通過-flag name=value 或者 -flag [+|-]name 來修改一部分運作期可修改的JVM參數。

        如果程序運作在64位虛拟機上,需要指明-J-d64參數,如:jinfo -J-d64 -sysprops pid另外,Java7的官方文檔指出,這一指令在後續的版本中可能不再使用。筆者使用的版本(jdk8)中已經不支援該指令

繼續閱讀