线上问题排查(2)——JDK内置工具
https://www.cnblogs.com/keanuyaoo/p/3253663.html
常用命令目录:
- jps命令(Java Virtual Machine Process Status Tool)
- jstat命令(Java Virtual Machine Statistics Monitoring Tool)
- jinfo命令(Java Configuration Info)
- jstack命令(Java Stack Trace)
- jmap命令(Java Memory Map)
1. jps
用于查看JVM里面所有进程的具体状态,包括进程ID,进程启动的路径等等
参数格式:
-m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。
-l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。(非常适用于task任务)
-v 输出传给JVM的参数。
示例:
[yang@vm-cbu-qa-172-43 ~]$ jps 12384 start.jar 10991 TimeoutMain 4309 AliWWMain 24586 Jps [yang@vm-cbu-qa-172-43 ~]$ jps -v 12384 start.jar -DappName=tradecenter:6100 -Dcom.taobao.pandora.tmp_path=/home/yang/output/logs/6100/pandora -DHSF.LOG.PATH=/home/yang/output/logs/6100/hsf -Xms256m -Xmx1024m -XX:MaxPermSize=128m -Ddatabase.codeset=ISO-8859-1 -Ddatabase.logging=false -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dapplication.codeset=GBK -Djava.util.logging.config.file=/home/yang/work/tc/tradecenter.deploy/target/web-deploy/conf/general/logging.properties -Dcom.sun.management.config.file=/home/yang/work/tc/tradecenter.deploy/target/web-deploy/conf/jmx/jmx_monitor_management.properties -Dorg.eclipse.jetty.util.URI.charset=GBK -Dhsf.configuration.dir=/home/yang/work/tc/tradecenter.deploy/target/web-deploy/jetty_server_home/tmp -Dlog4j.defaultInitOverride=false -Dcom.taobao.hsf.deploy.serverport=6130 -Dproject.name=tradecenter -Dhsf.server.port=6130 -Ddubbo.service.server.port=6100 -Ddragoon.instance.number=0 -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=6208,server=y,suspend=n -Dcom.sun.management.jmxr 10991 TimeoutMain -DTaskName=timeoutManager -Xms128m -Xmx512m -XX:PermSize=64m -Djox.xml.encodinged=true -Xdebug -Xrunjdwp:transport=dt_socket,address=9000,server=y,suspend=n 4309 AliWWMain -DTaskName=aliwwSender -Xms128m -Xmx512m -XX:PermSize=64m -Djox.xml.encodinged=true -Xdebug -Xrunjdwp:transport=dt_socket,address=8333,server=y,suspend=n -DhsfHome=/home/yang/work/tt/trade.task/target/expand/taobao-hsf.sar -Dproject.name=tradetask 24604 Jps -Dapplication.home=/usr/alibaba/install/jdk1.6.0_25 -Xms8m [yang@vm-cbu-qa-172-43 ~]$ jps -l 12384 /usr/alibaba/jetty/start.jar 10991 com.alibaba.china.trade.task.timeout.TimeoutMain 4309 com.alibaba.china.trade.task.aliww.AliWWMain 24666 sun.tools.jps.Jps [yang@vm-cbu-qa-172-43 ~]$
2. jstat
1)简介:
Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。由于JVM内存设置较大,图中百分比变化不太明显一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。
它主要是用来显示GC及PermGen相关的信息.
2)参数:
-class Option
-compiler Option
-gc Option
-gccapacity Option
-gccause Option
-gcnew Option
-gcnewcapacity Option
-gcold Option
-gcoldcapacity Option
-gcpermcapacity Option
-gcutil Option
-printcompilation Option
注:其中最常用的就是 -gcutil 选项了,因为他能够给我们展示大致的GC信息。
Option:指的是vmid、显示间隔时间及间隔次数等
vmid —VM的进程号,即当前运行的java进程号
interval– 间隔时间,单位毫秒
count — 打印次数,如果缺省则打印无数次
3)输出结果
S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S0C:S0当前容量的大小
S0U:S0已经使用的大小
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
S1C:S1当前容量的大小
S1U:S1已经使用的大小
E — Heap上的 Eden space 区已使用空间的百分比
EC:Eden space当前容量的大小
EU:Eden space已经使用的大小
O — Heap上的 Old space 区已使用空间的百分比
OC:Old space当前容量的大小
OU:Old space已经使用的大小
P — Perm space 区已使用空间的百分比
PC:Perm space当前容量的大小
PU:Perm space已经使用的大小
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC
4)示例
图中同时打印了young gc和full gc的总次数、总耗时。而每次young gc消耗的时间,可以用相间隔的两行(红线标示的)YGCT相减得到。每次full gc消耗的时间,可以用相隔的两行FGCT相减得到。
常驻内存区(P)的使用率,始终停留在64.78%左右,说明常驻内存没有突变,比较正常。如果young gc和full gc能够正常发生,而且都能有效回收内存,常驻内存区变化不明显,则说明java内存释放情况正常,垃圾回收及时,java内存泄露的几率就会大大降低,但也不能说明一定没有内存泄露。
jstat -class 进程id 显示加载 class 的数量,及所占空间等信息。
[yang@vm-cbu-qa-172-43 ~]$ jstat -class 12384 2000 Loaded Bytes Unloaded Bytes Time 11493 23583.9 195 291.8 12.31
3. jinfo
格式:jinfo 进程id
观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数
4. jstack
观察jvm中当前所有线程的运行情况和线程当前状态
详细使用可参考《java服务器load飚高排查思路》
5. jmap
1)简介
输出内存中对象的工具,打印出某个java进程在内存中所有“对象”的使用情况(如:产生那些对象、数量)
使用方法 jmap -histo pid。如果使用 jmap -histo pid > aa.log 可以将二进制输出到文本(aa.log)中,在一段时间后,使用文本比较工具,可以对比出GC回收了哪些对象。
jmap -dump:format=b,file=heap.bin 12384 可以将12384进程的内存堆栈输出到heap.bin 文件里,再配合MAT(内存分析工具(Memory Analysis Tool),参考文章 或 jhat (Java Heap Analysis Tool)一起使用,能够以图像的形式直观的反映当前内存是否存在问题。
如果你的机子是64位,格式:jmap -J-d64 -heap pid
2)参数格式
-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件中。 live子选项是可选的,假如指定live选项,那么只输出活的对象
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印heap的概要信息(年轻代、年老代、持久代的概括使用情况),GC使用的算法,heap的配置及wise heap的使用情况。
-histo[:live] 输出每个对象的实例个数、占用字节数、类全名信息。 VM的内部类名字开头会加上前缀”*”。如果加上live子参数,只统计活的对象数量。(ps:默认按内存中占用的字节数大小排序,使用场景较多)
-permstat 打印classloader和jvm heap的信息。 包含classloader的名字、加载的class数量、占用内存大小、父classloader、活跃性、类型。
3)实例
[yang@vm-cbu-qa-172-43 ~]$ jmap -histo 12384 >aa.log