JVM 性能调优监控工具

Java自带工具

jps

JVM Process Status Tool,现实指定系统内所有的HotSpot虚拟机进程

用来查看基于HotSpot JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。

语法结构:

jps [options ] [ hostid ]

[options]选项 :

  • -q: 输出VM标识符pid
  • -m:输出main method的参数
  • -l: 输出完全的包名,应用主类名,jar的完全路径名
  • -v: 输出jvm参数
  • -V: 输出通过flag文件传递到JVM中的参数
  • -Joption:传递参数到vm,例如:-J-Xms512m

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

如果不指定hostid就默认为当前主机或服务器

# jps -v
28815 start.jar -Djetty.home=/data/jetty -Djava.io.tmpdir=/tmp
30709 Jps -Denv.class.path=.:/data/java/jre/lib/rt.jar:/data/java/lib/dt.jar:/data/java/lib/tools.jar -Dapplication.home=/data/java -Xms8m
28851 XmlConfiguration -Xmx1000m -Xms1000m -Xmn512m -XX:PermSize=256m -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -XX:+PrintCommandLineFlags -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads=2 -XX:+CMSClassUnloadingEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=80 -Xloggc:logs/gc.log -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n -Djetty.home=/data/jetty -Djava.io.tmpdir=/dev/shm   -Dorg.apache.jasper.compiler.disablejsr199=true

jstat

JVM Statistics Monitoring Tool,用于收集Hotspot虚拟机各个方面的运行参数

查看classloader,compiler,gc相关信息,实时监控资源和性能 。jstat工具特别强大,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。

语法结构:

jstat -<option> [-t] [-h<lines>] <pid> [<interval> [<count>]]
  • Options — 通常使用 -gcutil 查看gc情况
  • interval – 间隔时间,单位为秒或者毫秒
  • count — 打印次数,如果缺省则打印无数次

[options]选项 :

  • class

显示加载class的数量,及所占空间等信息。

# jstat -class 21739 100 2
Loaded  Bytes  Unloaded  Bytes     Time   
   838  1708.1        0     0.0       0.98
   838  1708.1        0     0.0       0.98
  • compiler

显示VM实时编译的数量等信息。

# jstat -compiler 21739 100 2
Compiled Failed Invalid   Time   FailedType FailedMethod
      43      0       0     0.52          0             
      43      0       0     0.52          0 
  • gc

显示gc的信息,查看gc的次数,及时间。

# jstat -gc 21739 100 10
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   
2496.0 2496.0  0.0    0.0   15424.0   8208.7   40960.0      0.0     21248.0 5381.4      0    0.000   0      0.000    0.000
2496.0 2496.0  0.0    0.0   15424.0   8208.7   40960.0      0.0     21248.0 5381.4      0    0.000   0      0.000    0.000
2496.0 2496.0  0.0    0.0   15424.0   8208.7   40960.0      0.0     21248.0 5381.4      0    0.000   0      0.000    0.000
2496.0 2496.0  0.0    0.0   15424.0   8208.7   40960.0      0.0     21248.0 5381.4      0    0.000   0      0.000    0.000
2496.0 2496.0  0.0    0.0   15424.0   8208.7   40960.0      0.0     21248.0 5381.4      0    0.000   0      0.000    0.000
2496.0 2496.0  0.0    0.0   15424.0   8208.7   40960.0      0.0     21248.0 5381.4      0    0.000   0      0.000    0.000
2496.0 2496.0  0.0    0.0   15424.0   8208.7   40960.0      0.0     21248.0 5381.4      0    0.000   0      0.000    0.000
2496.0 2496.0  0.0    0.0   15424.0   8208.7   40960.0      0.0     21248.0 5381.4      0    0.000   0      0.000    0.000
2496.0 2496.0  0.0    0.0   15424.0   8208.7   40960.0      0.0     21248.0 5381.4      0    0.000   0      0.000    0.000
2496.0 2496.0  0.0    0.0   15424.0   8208.7   40960.0      0.0     21248.0 5381.4      0    0.000   0      0.000    0.000
参数说明
S0C新生代中Survivor space中S0当前容量的大小(KB)
S1C新生代中Survivor space中S1当前容量的大小(KB)
S0U新生代中Survivor space中S0容量使用的大小(KB)
S1U新生代中Survivor space中S1容量使用的大小(KB)
ECEden space当前容量的大小(KB)
EUEden space容量使用的大小(KB)
OCOld space当前容量的大小(KB)
OUOld space使用容量的大小(KB)
PCPermanent space当前容量的大小(KB)
PUPermanent space使用容量的大小(KB)
YGC从应用程序启动到采样时发生 Young GC 的次数
YGCT从应用程序启动到采样时 Young GC 所用的时间(秒)
FGC从应用程序启动到采样时发生 Full GC 的次数
FGCT从应用程序启动到采样时 Full GC 所用的时间(秒)
GCTT从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC
  • gccapacity

显示VM内存中三代(young,old,perm)对象的使用和占用大小

# jstat -gccapacity 21739 100 2
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC      PGCMN    PGCMX     PGC       PC     YGC    FGC 
 20416.0 327680.0  20416.0 2496.0 2496.0  15424.0    40960.0   655360.0    40960.0    40960.0  21248.0  83968.0  21248.0  21248.0      0     0
 20416.0 327680.0  20416.0 2496.0 2496.0  15424.0    40960.0   655360.0    40960.0    40960.0  21248.0  83968.0  21248.0  21248.0      0     0

  • gcutil

统计gc信息

# jstat -gcutil 21739 100 10
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00  53.22   0.00  25.33      0    0.000     0    0.000    0.000
  0.00   0.00  53.22   0.00  25.33      0    0.000     0    0.000    0.000
  0.00   0.00  53.22   0.00  25.33      0    0.000     0    0.000    0.000
  0.00   0.00  53.22   0.00  25.33      0    0.000     0    0.000    0.000
  0.00   0.00  53.22   0.00  25.33      0    0.000     0    0.000    0.000
  0.00   0.00  53.22   0.00  25.33      0    0.000     0    0.000    0.000
  0.00   0.00  53.22   0.00  25.33      0    0.000     0    0.000    0.000
  0.00   0.00  53.22   0.00  25.33      0    0.000     0    0.000    0.000
  0.00   0.00  53.22   0.00  25.33      0    0.000     0    0.000    0.000
  0.00   0.00  53.22   0.00  25.33      0    0.000     0    0.000    0.000
参数说明
S0Heap上的 Survivor space 0 区已使用空间的百分比
S1Heap上的 Survivor space 1 区已使用空间的百分比
EHeap上的 Eden space 区已使用空间的百分比
OHeap上的 Old space 区已使用空间的百分比
PPerm space 区已使用空间的百分比
YGC从应用程序启动到采样时发生 Young GC 的次数
YGCT从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC从应用程序启动到采样时发生 Full GC 的次数
FGCT从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
  • gcnew / gcnewcapacity

年轻代对象的信息(及其占用量)。

# jstat -gcnew 21739 100 2
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
2496.0 2496.0    0.0    0.0 15  15    0.0  15424.0   8208.7      0    0.000
2496.0 2496.0    0.0    0.0 15  15    0.0  15424.0   8208.7      0    0.000

# jstat -gcnewcapacity 21739 100 2
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
   20416.0   327680.0    20416.0 109184.0   2496.0 109184.0   2496.0   327552.0    15424.0     0     0
   20416.0   327680.0    20416.0 109184.0   2496.0 109184.0   2496.0   327552.0    15424.0     0     0
  • gcold / gcoldcapacity

old代对象的信息(及其占用量)。

# jstat -gcold 21739 100 2
   PC       PU        OC          OU       YGC    FGC    FGCT     GCT   
 21248.0   5381.4     40960.0         0.0      0     0    0.000    0.000
 21248.0   5381.4     40960.0         0.0      0     0    0.000    0.000
# jstat -gcoldcapacity 21739 100 2
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
    40960.0    655360.0     40960.0     40960.0     0     0    0.000    0.000
    40960.0    655360.0     40960.0     40960.0     0     0    0.000    0.000
  • gcpermcapacity

perm对象的信息及其占用量。

# jstat -gcpermcapacity 21739 100 2
  PGCMN      PGCMX       PGC         PC      YGC   FGC    FGCT     GCT   
   21248.0    83968.0    21248.0    21248.0     0     0    0.000    0.000
   21248.0    83968.0    21248.0    21248.0     0     0    0.000    0.000
  • printcompilation

当前VM执行的信息

# jstat -printcompilation 21739 100 2
Compiled  Size  Type Method
      43     81    2 org/apache/commons/launcher/StreamConnector run
      43     81    2 org/apache/commons/launcher/StreamConnector run

当前VM执行的信息。

jinfo

Configuration Info for Java,现实虚拟机配置信息

jinfo可以输出并修改运行时的java 进程的opts。用处比较简单,用于输出JAVA系统参数及命令行参数。

命令格式:

jinfo [option] pid

jmap

jmap用于生成堆转储快照(一般称为heapdump或者dump文件)。当然也可其他方法比如加参数-XX:+HeapDumpOnOutOfMemoryError参数,在虚拟机OOM异常的之后自动生成dump文件,也可以通过-XX:+HeapDumpOnCtrlBreak参数则可以使用Ctrl+Break键让虚拟机生成dump文件

jmap不仅能获取dump还可以查询finalize执行队列,java堆和永久代详细信息,空间使用率,当前用的是什么收集器等。

  • jmap -heap pid

查看heap的概要信息,GC使用的算法、heap的配置及wise heap的使用情况.

# jmap -heap 21739
Attaching to process ID 21739, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.7-b01

using thread-local object allocation.
Parallel GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 1006632960 (960.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 85983232 (82.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 15794176 (15.0625MB)
   used     = 8405680 (8.016281127929688MB)
   free     = 7388496 (7.0462188720703125MB)
   53.22012367090249% used
From Space:
   capacity = 2555904 (2.4375MB)
   used     = 0 (0.0MB)
   free     = 2555904 (2.4375MB)
   0.0% used
To Space:
   capacity = 2555904 (2.4375MB)
   used     = 0 (0.0MB)
   free     = 2555904 (2.4375MB)
   0.0% used
PS Old Generation
   capacity = 41943040 (40.0MB)
   used     = 0 (0.0MB)
   free     = 41943040 (40.0MB)
   0.0% used
PS Perm Generation
   capacity = 21757952 (20.75MB)
   used     = 5510576 (5.2552947998046875MB)
   free     = 16247376 (15.494705200195312MB)
   25.32672192676958% used

1654 interned Strings occupying 124952 bytes.
  • jmap -histo[:live] pid

打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.

# jmap -histo:live 21739

 num     #instances         #bytes  class name
----------------------------------------------
   1:         10450        1459744  <constMethodKlass>
   2:         10450        1426864  <methodKlass>
   3:          1555         984208  [B
   4:           838         972256  <constantPoolKlass>
   5:           756         623200  <constantPoolCacheKlass>
   6:           838         616368  <instanceKlassKlass>
   7:          2750         287800  [C
   8:           917         111752  java.lang.Class
   9:          1249          84440  [S
  10:          1257          71960  [[I
  11:          2646          63504  java.lang.String
  12:           734          41760  [I
  13:            83          39352  <methodDataKlass>
  • jmap -dump:live,format=b,file=

使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件,再 用jhat、MAT、VisualVM分析查看,以便查找内存溢出原因

# jmap -dump:live,format=b,file=cache.dump.bin 21739
Dumping heap to /data/log/task/cache.dump.bin ...
Heap dump file created

image

  • finalizerinfo

打印正等候回收的对象的信息

# jmap -finalizerinfo 21739
Attaching to process ID 21739, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.7-b01
Number of objects pending for finalization: 0
  • heap

打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.

# jmap -heap 21739
Attaching to process ID 21739, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.7-b01

using thread-local object allocation.
Parallel GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 1006632960 (960.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 85983232 (82.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 15794176 (15.0625MB)
   used     = 0 (0.0MB)
   free     = 15794176 (15.0625MB)
   0.0% used
From Space:
   capacity = 2555904 (2.4375MB)
   used     = 0 (0.0MB)
   free     = 2555904 (2.4375MB)
   0.0% used
To Space:
   capacity = 2555904 (2.4375MB)
   used     = 0 (0.0MB)
   free     = 2555904 (2.4375MB)
   0.0% used
PS Old Generation
   capacity = 16711680 (15.9375MB)
   used     = 863536 (0.8235321044921875MB)
   free     = 15848144 (15.113967895507812MB)
   5.167260263480392% used
PS Perm Generation
   capacity = 21757952 (20.75MB)
   used     = 5511296 (5.2559814453125MB)
   free     = 16246656 (15.4940185546875MB)
   25.33003106174699% used

1511 interned Strings occupying 115696 bytes.

  • permstat

打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.

# jmap -permstat 21739
Attaching to process ID 21739, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.7-b01
finding class loader instances ..none
null_check
null_assert
range_check
class_check
array_check
intrinsic
bimorphic
unloaded
uninitialized
unreached
unhandled
constraint
div0_check
age
predicate
loop_limit_check
done.
computing per loader stat ..done.
please wait.. computing liveness...................................liveness analysis may be inaccurate ...
class_loader	classes	bytes	parent_loader	alive?	type

<bootstrap>	700	4402352	  null  	live	<internal>
0x00000000c4061630	257	1960584	0x00000000c401ffd8	live	java/net/URLClassLoader@0x00000000befa37e8
0x00000000c4020028	0	0	  null  	live	sun/misc/Launcher$ExtClassLoader@0x00000000befa3c38
0x00000000c401ffd8	20	302096	0x00000000c4020028	live	sun/misc/Launcher$AppClassLoader@0x00000000bf0172a0

total = 4	977	6665032	    N/A    	alive=4, dead=0	    N/A 
  • F

强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效

jstack

jstack用于生成java虚拟机当前时刻的线程快照,主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。

语法:

jstack [ option ] pid
-F 当 jstack [-l] pid 没有响应的时候强制打印栈信息
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m 打印java和native c/c++框架的所有栈信息.

jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多
例如 如何找到 Java 进程中哪个线程占用了大量 CPU 处理时间 就是通过jstack定位的

jhat

JVM heap Dunp Browser,用于分析heapdump文件,他会建立一个HTTP/HTML服务,让用户可通过浏览器查看

jhat是sun提供的dump分析工具,上面讲过分析dump的工具还有MAT( Eclipse Memory Analyzer tool)、IBM HeapAnalyzer等,一般这个命令不太用到,是因为分析dump是个既耗时又耗机器资源的过程,第二个原因是这个工具比较简陋,没有MAT( Eclipse Memory Analyzer tool)、IBM HeapAnalyzer这些专业和强大。

所以直接通过jmap dump内存,然后通过工具来分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值