JVM性能調優監控工具jps、jstack、jstat、jmap、jinfo使用詳解

雨傘是什麼

jps

查看全部的jvm進程,包括進程ID,進程啓動的路徑等等。html

我本身也用PS,即:ps -ef | grep javajava

jstack

觀察jvm中當前全部線程的運行狀況和線程當前狀態。linux

系統崩潰了?若是java程序崩潰生成core文件,jstack工具能夠用來得到core文件的java stacknative stack的信息,從而能夠輕鬆地知道java程序是如何崩潰和在程序何處發生問題。spring

系統hung住了?jstack工具還能夠附屬到正在運行的java程序中,看到當時運行的java程序的java stacknative stack的信息, 若是如今運行的java程序呈現hung的狀態,jstack是很是有用的。apache

jstat

jstat利用JVM內建的指令對Java應用程序的資源和性能進行實時的命令行的監控,包括了對進程的classloadercompilergc狀況;服務器

特別的,一個極強的監視內存的工具,能夠用來監視VM內存內的各類堆和非堆的大小及其內存使用量,以及加載類的數量。oracle

jmap

監視進程運行中的jvm物理內存的佔用狀況,該進程內存內,全部對象的狀況,例如產生了哪些對象,對象數量;app

系統崩潰了?jmap 能夠從core文件或進程中得到內存的具體匹配狀況,包括Heap size, Perm size等等jvm

jinfo

觀察進程運行環境參數,包括Java System屬性和JVM命令行參數ide

系統崩潰了?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

LoadedNumber of classes loaded.

BytesNumber of Kbytes loaded.

UnloadedNumber of classes unloaded.

BytesNumber of Kbytes unloaded.

TimeTime 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

S0CCurrent survivor space 0 capacity (KB).

S1CCurrent survivor space 1 capacity (KB).

S0UCurrent survivor space 0 utilization (KB).

S1UCurrent survivor space 1 utilization (KB).

ECCurrent eden space capacity (KB).

EUEden space utilization (KB).

OCCurrent old space capacity (KB).

OUOld space utilization (KB).

PCCurrent permanent space capacity (KB).

PUPermanent space utilization (KB).

YGCNumber of young generation GC Events.

YGCTYoung generation garbage collection time.

FGCNumber of full GC events.

FGCTFull garbage collection time.

GCTTotal 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內存佔用量。其餘的能夠根據這個類推, OCold內純的佔用量。

[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  OCold內純的佔用量

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等等,目前只有在SolarisLinuxJDK版本里面纔有。

觀察運行中的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 如:查看2788MaxPerm大小能夠用  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,選則進程就能夠了。

相關文章
相關標籤/搜索