jps
查看所有的jvm進程,包括進程ID,進程啟動的路徑等等。
我自己也用PS,即:ps -ef | grep java
jstack
觀察jvm中當前所有線程的運行情況和線程當前狀態。
系統崩潰了?如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發生問題。
系統hung住了?jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 如果現在運行的java程序呈現hung的狀態,jstack是非常有用的。
jstat
jstat利用JVM內建的指令對Java應用程序的資源和性能進行實時的命令行的監控,包括了對進程的classloader,compiler,gc情況;
特別的,一個極強的監視內存的工具,可以用來監視VM內存內的各種堆和非堆的大小及其內存使用量,以及加載類的數量。
jmap
監視進程運行中的jvm物理內存的占用情況,該進程內存內,所有對象的情況,例如產生了哪些對象,對象數量;
系統崩潰了?jmap 可以從core文件或進程中獲得內存的具體匹配情況,包括Heap size, Perm size等等
jinfo
觀察進程運行環境參數,包括Java System屬性和JVM命令行參數
系統崩潰了?jinfo可以從core文件里面知道崩潰的Java應用程序的配置信息。
備注
如果能熟練運用這些命令,尤其是在linux下,那么完全可以代替jprofile等監控工具。
用命令的好處就是速度快,並且輔助於其他命令,比如grep gawk sed等,可以組裝多種符合自己需求的工具。
怎么用
====================以下為較常用====================
jstat
具體參數如下:
-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情況
$ jstat -class 17970 1000 10 (每隔1秒監控一次,一共做10次)
Loaded Bytes Unloaded Bytes Time
7837 8534.0 1069 1005.7 27.87
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 17970 2000 20 (每隔2秒監控一次,共20次)
$ jstat -gcutil 17970 1000 10 (按百分比顯式)
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
15936.0 15936.0 9030.8 0.0 127872.0 61813.5 901120.0 544712.5 65536.0 35227.8 42078 2796.028 417 498.596 3294.624
S0C:Current survivor space 0 capacity (KB).
S1C:Current survivor space 1 capacity (KB).
S0U:Current survivor space 0 utilization (KB).
S1U:Current survivor space 1 utilization (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 -compiler 17970 (顯示VM實時編譯的數量等信息)
Compiled Failed Invalid Time FailedType FailedMethod
3780 1 0 120.26 2 com/xxx/xxx run
jstat –gccapacity :可以顯示,VM內存中三代(young,old,perm)對象的使用和占用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存占用量,PC是但前perm內存占用量。其他的可以根據這個類推, OC是old內純的占用量。
[root@localhost bin]# jstat -gccapacity 25917
NGCMN 640.0
NGCMX 4992.0
NGC 832.0
S0C 64.0
S1C 64.0
EC 704.0
OGCMN 1408.0
OGCMX 60544.0
OGC 9504.0
OC 9504.0 OC是old內純的占用量
PGCMN 8192.0 PGCMN顯示的是最小perm的內存使用量
PGCMX 65536.0 PGCMX顯示的是perm的內存最大使用量
PGC 12800.0 PGC是當前新生成的perm內存占用量
PC 12800.0 PC是但前perm內存占用量
YGC 164
FGC 6
jstat -gcnew pid: new對象的信息
[root@localhost bin]# jstat -gcnew 25917
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
64.0 64.0 47.4 0.0 2 15 32.0 704.0 145.7 168 0.254
jstat -gcnewcapacity pid: new對象的信息及其占用量
[root@localhost bin]# jstat -gcnewcapacity 25917
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
640.0 4992.0 832.0 64.0 448.0 448.0 64.0 4096.0 704.0 168 6
jstat -gcold pid: old對象的信息。
[root@localhost bin]# jstat -gcold 25917
PC PU OC OU YGC FGC FGCT GCT
12800.0 12617.6 9504.0 6561.3 169 6 0.335 0.591
jstat -gcoldcapacity pid:old對象的信息及其占用量。
[root@localhost bin]# jstat -gcoldcapacity 25917
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
1408.0 60544.0 9504.0 9504.0 169 6 0.335 0.591
jstat -gcpermcapacity pid: perm對象的信息及其占用量。
[root@localhost bin]# jstat -gcpermcapacity 25917
PGCMN PGCMX PGC PC YGC FGC FGCT GCT
8192.0 65536.0 12800.0 12800.0 169 6 0.335 0.591
jstat -printcompilation pid:當前VM執行的信息。
[root@localhost bin]# jstat -printcompilation -h3 25917 1000 5
每1000毫秒打印一次,一共打印5次,還可以加上-h3每三行顯示一下標題。
Compiled Size Type Method
788 73 1 java/io/File <init>
788 73 1 java/io/File <init>
788 73 1 java/io/File <init>
Compiled Size Type Method
788 73 1 java/io/File <init>
788 73 1 java/io/File <init>
jmap
jmap -dump:format=b,file=dump.bin pid
jmap 可以從core文件或進程中獲得內存的具體匹配情況,包括Heap size, Perm size等等,目前只有在Solaris和Linux的JDK版本里面才有。
觀察運行中的jvm物理內存的占用情況
打印出某個java進程(使用pid)內存內的,所有‘對象’的情況(如:產生那些對象,及其數量)。
可以輸出所有內存中對象的工具,甚至可以將VM 中的heap,以二進制輸出成文本。使用方法 jmap -histo pid。如果連用SHELL jmap -histo pid>a.log可以將其保存到文本中去,在一段時間后,使用文本對比工具,可以對比出GC回收了哪些對象。jmap -dump:format=b,file=String 3024可以將3024進程的內存heap輸出出來到String文件里。
[root@localhost bin]# jmap -histo 25917
Attaching to process ID 26221, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 1.5.0_08-b03
Iterating over heap. This may take a while...
Unknown oop at 0xaa6e42d0
Oop's klass is null
Object Histogram:
Size Count Class description
-------------------------------------------------------
3722768 30467 * ConstMethodKlass
1976480 25334 char[]
1907880 46994 * SymbolKlass
1762088 2947 byte[]
1709536 30467 * MethodKlass
1487816 2600 * ConstantPoolKlass
1009576 2600 * InstanceKlassKlass
904880 2199 * ConstantPoolCacheKlass
741432 30893 java.lang.String
653576 4785 int[]
351760 4397 java.lang.reflect.Method
277824 2894 java.lang.Class
248704 3401 short[]
200888 4411 java.lang.Object[]
193656 4045 java.lang.Object[]
179744 5617 java.util.TreeMap$Entry
175688 1800 java.util.HashMap$Entry[]
165288 6887 java.util.HashMap$Entry
104736 3273 java.lang.ref.SoftReference
104136 4339 java.lang.ref.WeakReference
96096 3521 java.lang.String[]
86160 3590 java.util.Hashtable$Entry
85584 3566 java.util.ArrayList
83472 1206 java.util.Hashtable$Entry[]
82944 1728 java.beans.MethodDescriptor
80560 265 * ObjArrayKlassKlass
69120 1728 java.util.HashMap
52464 3055 java.lang.Class[]
43040 1076 java.util.Hashtable
42496 664 org.apache.commons.modeler.AttributeInfo
37880 947 java.util.TreeMap
33896 557 javax.management.modelmbean.ModelMBeanAttributeInfo[]
33152 518 java.beans.PropertyDescriptor
616 11 org.springframework.aop.framework.ProxyFactory
608 19 java.util.PropertyPermission
608 38 org.springframework.beans.MutablePropertyValues
608 38 org.springframework.beans.factory.support.MethodOverrides
608 2 * ArrayKlassKlass
608 38 org.springframework.beans.factory.config.ConstructorArgumentValues
608 4 org.apache.xerces.impl.XMLDTDScannerImpl
576 24 java.util.Stack
576 36 java.util.regex.Pattern$Category
576 24 org.apache.naming.NamingEntry
560 7 java.net.URL[]
552 23 sun.management.MappedMXBeanType$BasicMXBeanType
552 1 java.util.Locale[]
552 22 java.io.ObjectStreamField[]
544 17 java.util.Collections$SynchronizedMap
176 11 java.util.regex.Pattern$Ctype
8 1 sun.reflect.GeneratedMethodAccessor49
8 1 sun.reflect.GeneratedMethodAccessor6
8 1 sun.reflect.GeneratedConstructorAccessor10
Heap traversal took 12.003 seconds.
jinfo
可以輸出並修改運行時的java 進程的opts。用處比較簡單,就是能輸出並修改運行時的java進程的運行參數。用法是jinfo -opt pid 如:查看2788的MaxPerm大小可以用 jinfo -flag MaxPermSize 2788。
課外補充
jstatd
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstatd.html
啟動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;
};
jdb
jdb 用來對core文件和正在運行的Java進程進行實時地調試,里面包含了豐富的命令幫助您進行調試,它的功能和Sun studio里面所帶的dbx非常相似,但 jdb是專門用來針對Java應用程序的。
用來對core文件和正在運行的Java進程進行實時地調試,里面包含了豐富的命令幫助您進行調試,它的功能和Sun studio里面所帶的dbx非常相似,但 jdb是專門用來針對Java應用程序的。
jconsole
jconsole是基於 (JMX)的實時圖形化監測工具,這個工具利用了內建到JVM里面的JMX指令來提供實時的性能和資源的監控,包括了Java程序的內存使用,Heap size, 線程的狀態,類的分配狀態和空間使用等等。
與jstat相當。
jconsole:一個java GUI監視工具,可以以圖表化的形式顯示各種數據。並可通過遠程連接監視遠程的服務器VM。
用java寫的GUI程序,用來監控VM,並可監控遠程的VM,非常易用,而且功能非常強。命令行里打 jconsole,選則進程就可以了。