JVM性能调优监控工具jps、jstack、jstat、jmap、jinfo使用详解

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.

[图片上传失败...(image-fa04a8-1550483898645)]

**$ 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,选则进程就可以了。

顺便在此给大家推荐一个Java方面的交流学习群:957734884,里面会分享一些高级面试题,还有资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系,主要针对Java开发人员提升自己,突破瓶颈,相信你来学习,会有提升和收获。在这个群里会有你需要的内容 朋友们请抓紧时间加入进来吧

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容