jstack, jstat, jmap, jinfo, 教你如何在背後偷窺你的程式^^

五柳-先生發表於2016-06-15

呵呵,不著急,先一下“是什麼”,再說一下“怎麼用”。

 

雨傘 是什麼

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應用程式的資源和效能進行實時的命令列的監控,包括了對程式的classloadercompilergc情況;
  • 特別的,一個極強的監視記憶體的工具,可以用來監視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情況 
-printcompilation:不知道幹什麼的,一直沒用過。 
一般比較常用的幾個用法: 

$ 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,選則程式就可以了

轉載:http://www.cnblogs.com/alipayhutu/archive/2012/08/20/2647353.html

相關文章