线上问题排查(2)——JDK内置工具

https://www.cnblogs.com/keanuyaoo/p/3253663.html

常用命令目录:

 

 

 

 

 

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 

posted @ 2019-02-14 16:49  那家那人那小伙  阅读(380)  评论(0编辑  收藏  举报