Java 命令:jps / jinfo / jstack / jstat/ jmap

我们在开发中会遇到想要监控服务器上jvm 的实时运行状态的场景,那我们就需要知道一些jvm 的命令,来了解jvm 的一个运行状况。我们这里主要提到5个命令,首先通过jps 查询出服务器上全部java 进程的pid以及名称等;jinfo 查看具体java pid的详细信息;jstack 则可以实时生成jvm的堆栈信息;jstat 可以查询jvm 的各种维度的统计信息;最后是jmap 可以实时生成jvm 的堆快照信息。

下面依次介绍这5个命令


1.jps

jps是jdk1.5开始提供的一个查看当前所有java进程状态的命令。与ps类似,可以看成是ps的一个子集,只显示java进程的状态。

jps全称:Java virtual machine Process Status tool (java虚拟机进程状态工具)

jps用法:jps [options] [hostid]

        [options]: 命令选项,用来对输出格式进行控制

        [hostid]: 主机标识,如果没有这个,就默认显示本机上的全部jvm

        jps功能:主要查看机器上的jvm状态(jvm进程id,主类类名,jvm参数,jar名称)

命令选项示例 

-q 仅显示jvm的进程id

[root@izbp14wmlq6ajvhexzq3q0z ~]# jps -q
30217
3274
28922

-l 显示完整的包名或jar全名

[root@izbp14wmlq6ajvhexzq3q0z ~]# jps -l
30199 sun.tools.jps.Jps
3274 dev-manage-web.jar
28922 com.aliyun.tianji.cloudmonitor.Application

-v 显示jvm参数 

[root@izbp1fhg9uji22s22d78p0z ~]# jps -v
12608 jar -Xmx512m -Xms512m
30882 jar -Xmx512m -Xms512m
3241 Jps -Dapplication.home=/opt/tools/jdk1.8.0_151 -Xms8m

-m 输出传递给main方法的参数,如果是内嵌的jvm,则为null

[root@izbp14wmlq6ajvhexzq3q0z ~]# jps -m
3274 jar
28922 Application
30399 Jps -m

2.jinfo

通过jps能得到服务器上的全部jvm简单信息,然后可以通过jinfo pid查看具体的jvm 信息

[root@izbp16djex81rgji9ycnyfz ~]# jinfo 2384
Attaching to process ID 2384, please wait...
# 调试器连接成功
Debugger attached successfully.
# 服务编译检测
Server compiler detected.
# JVM版本
JVM version is 25.151-b12
Java System Properties:
 
# java运行时名称
java.runtime.name = Java(TM) SE Runtime Environment
# java虚拟机版本
java.vm.version = 25.151-b12
# 根lib路径
sun.boot.library.path = /usr/local/jdk/jre/lib/amd64

# java协议处理包
java.protocol.handler.pkgs = org.springframework.boot.loader
# java供应商url
java.vendor.url = http://java.oracle.com/
# java供应商
java.vm.vendor = Oracle Corporation
# 路径分割符
path.separator = :
# 文件编码包
file.encoding.pkg = sun.io

# java虚拟机名称
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
# sun系统补丁级别
sun.os.patch.level = unknown
# java发布者
sun.java.launcher = SUN_STANDARD
# 用户国籍
user.country = US
# 用户目录
user.dir = /opt/app
# java虚拟机详细名称
java.vm.specification.name = Java Virtual Machine Specification

# jvm进程
PID = 2384
# java运行时版本
java.runtime.version = 1.8.0_151-b12
# java图形化环境
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = /usr/local/jdk/jre/lib/endorsed
# 日志提供者slf4j
org.jboss.logging.provider = slf4j
line.separator = 
 
# java io 的缓存目录
java.io.tmpdir = /tmp
java.vm.specification.vendor = Oracle Corporation
# 操作系统名称
os.name = Linux
# 日志级别类型
LOG_LEVEL_PATTERN = %5p [bootstrap,%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},
%X{X-Span-Export:-}]
# 默认编码
sun.jnu.encoding = UTF-8
java.library.path = /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
spring.beaninfo.ignore = true
# 默认监听注册
com.netflix.servo.DefaultMonitorRegistry.registryClass = 
com.netflix.servo.BasicMonitorRegistry
java.specification.name = Java Platform API Specification
java.class.version = 52.0

# 编译器类型
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
os.version = 3.10.0-693.2.2.el7.x86_64
# 用户主页
user.home = /root
# 用户时区
user.timezone = Asia/Shanghai
catalina.useNaming = false
java.awt.printerjob = sun.print.PSPrinterJob
file.encoding = UTF-8

# 应用id
@appId = provider
java.specification.version = 1.8
catalina.home = /tmp/tomcat.8133575666112202129.8065
user.name = root

# java类路径
java.class.path = aps-provider.jar
java.vm.specification.version = 1.8
sun.arch.data.model = 64
sun.java.command = micro-service-aps-provider.jar
# java主页
java.home = /usr/local/jdk/jre
user.language = en
java.specification.vendor = Oracle Corporation
awt.toolkit = sun.awt.X11.XToolkit
java.vm.info = mixed mode
java.version = 1.8.0_151
java.ext.dirs = /usr/local/jdk/jre/lib/ext:/usr/java/packages/lib/ext
sun.boot.class.path = 
/usr/local/jdk/jre/lib/resources.jar:/usr/local/jdk/jre/lib/rt.jar:/usr/local/jdk/jre/lib
/sunrsasign.jar:/usr/local/jdk/jre/lib/jsse.jar:/usr/local/jdk/jre/lib/jce.jar:/usr/local
/jdk/jre/lib/charsets.jar:/usr/local/jdk/jre/lib/jfr.jar:/usr/local/jdk/jre/classes
java.awt.headless = true
java.vendor = Oracle Corporation

# catalina日志
catalina.base = /tmp/tomcat.8133575666112202129.8065
file.separator = /
java.vendor.url.bug = http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
sun.cpu.isalist = 
 
VM Flags:
# 非默认的虚拟机标志
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=262144000 -
XX:MaxHeapSize=4164943872 -XX:MaxNewSize=1388314624 -XX:MinHeapDeltaBytes=524288 -
XX:NewSize=87031808 -XX:OldSize=175112192 -XX:+UseCompressedClassPointers -
XX:+UseCompressedOops -XX:+UseParallelGC 

Command line:  

其中Non-default VM flags很重要

3.jstack

jstack是jvm自带的一种堆栈跟踪工具

jstack 主要用于生成jvm虚拟机当前时刻的 线程快照。线程快照是当前jvm内每一条线程正在执行的方法堆栈的集合。生成线程快照的主要目的是定位线程出现长时间停顿的原因,比如线程间死锁,死循环,外部请求资源导致长时间的等待等。线程出现停顿的时候可以通过jstack来查看各个线程的调用堆栈,就可以分析出没有响应的线程在后台在做什么,或者在等待什么资源。

4.jstat

jstat(java virtual machine statistics Monitoring Tool)jvm统计监控工具

jstat用于监控基于HotSpot的jvm,对其堆的使用情况进行实时的命令行的统计

可以针对以下选项对jvm进行不同维度的统计:

        

[root@izbp14wmlq6ajvhexzq3q0z ~]# jstat -class 3274
Loaded  Bytes  Unloaded  Bytes     Time   
 11832 22193.8      128   187.0      12.63

loaded:加载class的数量

Bytes:所占用的空间大小

Unloaded:未加载数量

Bytes:未加载占用的空间

Time:时间

        编译统计

[root@izbp14wmlq6ajvhexzq3q0z ~]# jstat -compiler 3274
Compiled Failed Invalid   Time   FailedType FailedMethod
   16764      2       0    95.28          1 com/mysql/jdbc/AbandonedConnectionCleanupThread run

Compiled:编译数量

Failed:失败数量

Invalid:无效数量

Time:时间

FailedType:失败的类型

FailedMethod:失败的方法

        垃圾回收统计

[root@izbp14wmlq6ajvhexzq3q0z ~]# jstat -gc 3274
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
1024.0 1024.0 225.1   0.0   321536.0 108375.6  111104.0   76088.7   71384.0 69460.5 8192.0 7783.8  16000   63.587   4      0.608   64.196

S0C:(Survivor)年轻代中第一个幸存区大小

S1C:(Survivor)年轻代中第二个幸存区大小

S0U:(Survivor Used)年轻代中第一个幸存区的使用大小

S1C:(Survivor Used)年轻代中第二个幸存区的使用大小

EC:伊甸园区的大小

EU:伊甸园区的使用大小

OC:老年代的大小

OU:老年代的使用大小

MC:方法区的大小

MU:方法区的使用大小

CCSC:压缩类空间的大小

CCSU:压缩类空间的使用大小

YGC:(Number of young generation GC Events)年轻代GC事件的数量

YGCT:(Young generation garbage collection time)年轻代GC的时间

FGC:(Number of full GC events)完整GC事件的数量

FGCT:(Full garbage collection time)完整GC的时间

GCT:(Total garbage collection time)全部GC的时间

        堆内存统计

[root@izbp14wmlq6ajvhexzq3q0z ~]# jstat -gccapacity 3274 
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
 20480.0 323584.0 323584.0 1024.0 1024.0 321536.0    40960.0   647168.0   111104.0   111104.0      0.0 1112064.0  71384.0      0.0 1048576.0   8192.0  16000     4

NGCMN:新生代最小容量

NGCMX:新生代最大容量

NGC:当前新生代容量

S0C:第一个幸存区大小

S1C:第二个幸存区大小

EC:伊甸园区的大下

OGCMN:老年代最小容量

OGCMX:老年代最大容量

OGC:当前老年代大小

OC:当前老年代大小

MCMN:最小元数据容量

MCMX:最大元数据容量

MC:当前元数据空间

CCSMN:最小压缩类空间大小

CCSMX:最大压缩类空间大小

CCSC:当前压缩类空间大小

YGC:年轻代GC次数

FGC:老年代GC次数

        新生代垃圾回收统计

[root@izbp14wmlq6ajvhexzq3q0z ~]# jstat -gcnew 3274
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
1024.0 1024.0  225.1    0.0 15  15 1024.0 321536.0 306423.0  16000   63.587

S0C:第一个幸存区的大小

S1C:第二个幸存区的大小

S0U:第一个幸存区的使用大小

S1U:第二个幸存区的使用大小

TT:对象在新生代的存活次数

MTT:对象在新生代的最大存活次数

DSS:期望的幸存区大小

EC:伊甸园区的大小

EU:伊甸园区的使用大小

YGC:年轻的垃圾回收的次数

YGCT:年轻代垃圾回收的时间

        新生代内存统计

[root@izbp14wmlq6ajvhexzq3q0z ~]# jstat -gcnewcapacity 3274
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
   20480.0   323584.0   323584.0 107520.0   1024.0 107520.0   1024.0   322560.0   321536.0 16001     4

NGCMN:新生代最小容量

NGCMX:新生代最大容量

NGC:当前新生代容量

S0CMX:第一个幸存区最大大小

S0C:第一个幸存区当前大小

S1CMX:第二个幸存区最大大小

S1C:第二个幸存区当前大小

ECMX:伊甸园区最大大小

EC:伊甸园区当前大小

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

        老年代垃圾回收统计

[root@izbp14wmlq6ajvhexzq3q0z ~]#  jstat -gcold 3274
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   
 71384.0  69462.0   8192.0   7783.8    111104.0     76088.7  16001     4    0.608   64.200

MC:方法区大小

MU:方法区使用大小

CCSC:压缩空间大小

CCSU:压缩空间已使用大小

OC:老年代大小

OU:老年代已使用大小

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间

        老年代内存统计

[root@izbp14wmlq6ajvhexzq3q0z ~]#  jstat -gcoldcapacity 3274
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
    40960.0    647168.0    111104.0    111104.0 16001     4    0.608   64.200

OGCMN:老年代最小容量

OGCMX:老年代最大容量

OGC:当前老年代大小

OC:老年代大小

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收时间

GCT:垃圾回收总时间

        元数据空间统计

[root@izbp14wmlq6ajvhexzq3q0z ~]# jstat -gcmetacapacity 3274
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT   
       0.0  1112064.0    71384.0        0.0  1048576.0     8192.0 16001     4    0.608   64.200

MCMN:最小元数据大小

MCMX:最大元数据大小

MC:当前元数据大小

CCSMN:最小压缩空间大小

CCSMX:最大压缩空间大小

CCSC:当前压缩类空间大小

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收时间

GCT:垃圾回收总时间

        总结垃圾回收统计

[root@izbp14wmlq6ajvhexzq3q0z ~]# jstat -gcutil 3274
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  29.90  91.47  68.48  97.31  95.02  16001   63.592     4    0.608   64.200

S0:第一个幸存区的使用比率

S1:第二个幸存区的使用比率

E:伊甸园区的使用比率

O:老年代的使用比率

M:元数据的使用比率

CCS:压缩空间的使用比率

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收时间

GCT:垃圾回收时间

不难发现,有些命令统计了相同的一些指标,比如很多命令都统计了FGC次数

5.jmap

jmap命令主要用于生成java 堆dump文件,如果不使用这个命令,也可以使用-XX:+HeapDumpOnOutOfMemoryError参数让虚拟机出现OOM(Out Of Memory)时,自动生成dump文件。

jmap的主要功能:查询Java堆和永久代的详细信息,使用率,使用大小,查询finalize执行队列的信息

jmap的用法:jmap [option] <pid>  用来连接运行的进程

        jmap [option] <executable <core>> 用来连接一个core文件

        jmap [option] [server_id@]<remote server IP or hostname> 用来连接一个远程ip或主机

        [option]:    选项参数是互斥的,不能同时使用

        heap: 显示java堆的详细信息

        histo: 显示堆中对象的统计信息

        clstats: 显示类加载统计

        finalizerinfo: 显示在F-QUEUE中等待执行Finalizer线程执行finalizer方法的对象

        dump: 生成堆转存文件

        F: 当-dump没有响应时,强制生成dump快照

命令选项示例

        -finalizerinfo 打印等待回收的对象信息

[root@VM_0_12_centos ~]# jmap -finalizerinfo 32609
Attaching to process ID 32609, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12
Number of objects pending for finalization: 0

        最后一句表明当前 F-QUEUE 队列中没有等待 Finalizer 线程执行 finalizer 方法的对象

        -heap显示堆的详细信息

[root@localhost ~]# jmap -heap 1570
Attaching to process ID 1570, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12

using thread-local object allocation.
Parallel GC with 4 thread(s) // GC的方式

Heap Configuration:   // 堆内存的初始化配置信息
   MinHeapFreeRatio         = 0     // 对应jvm启动参数 -XX:MinHeapFreeRatio jvm最小空闲内存比率
   MaxHeapFreeRatio         = 100   // 对应jvm启动参数 -XX:MaxHeapFreeRatio jvm最大空闲内存比率
   MaxHeapSize              = 1996488704 (1904.0MB)   // 对应jvm启动参数 -XX:MaxHeapSize jvm堆的最大堆大小
   NewSize                  = 41943040 (40.0MB)       // 对应jvm启动参数 -XX:NewSize jvm堆新生代默认大小
   MaxNewSize               = 665321472 (634.5MB)     // 对应jvm启动参数 -XX:MaxNewSize jvm堆新生代最大大小
   OldSize                  = 83886080 (80.0MB)       // 对应jvm启动参数 -XX:OldSize jvm堆的老年代大小
   NewRatio                 = 2  // 对应jvm启动参数 -XX:NewRatio '新生代'和'老年代'的大小比率
   SurvivorRatio            = 8  // 对应jvm启动参数 -XX:SurvivorRatio 设置年轻代中Eden区与Survivor区大小比率
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:  //堆内存使用情况
PS Young Generation
Eden Space:  // Eden区内存分布
   capacity = 306184192 (292.0MB)  //Eden区总容量
   used     = 197876024 (188.70928192138672MB)  //Eden区已使用
   free     = 108308168 (103.29071807861328MB)  //Eden区剩余容量
   64.62646641143381% used    //Eden区使用比率
From Space:   //其中一个Survivor区的内存分布
   capacity = 16777216 (16.0MB)
   used     = 524288 (0.5MB)
   free     = 16252928 (15.5MB)
   3.125% used
To Space:     //另一个Survivor区的内存分布
   capacity = 15728640 (15.0MB)
   used     = 0 (0.0MB)
   free     = 15728640 (15.0MB)
   0.0% used
PS Old Generation  //当前的old区内存分布
   capacity = 127926272 (122.0MB)
   used     = 34253488 (32.66667175292969MB)
   free     = 93672784 (89.33332824707031MB)
   26.775960453221057% used

25017 interned Strings occupying 3208280 bytes.

        -dump 将堆信息转存到文件

[root@localhost ~]# jmap -dump:live,format=b,file=/dump.dat 1570 
Dumping heap to /dump.dat ...
Heap dump file created

        -histo 打印堆的对象统计,包括对象数,内存大小等。jmap -histo:live 这个命令执行时,jvm会先触发gc,然后再统计信息。所以这个命令要慎用。这个可能会显示很多,所以一次显示100条

[root@localhost ~]# jmap -histo:live 1570 | more 100

 num     #instances         #bytes  class name
----------------------------------------------
   1:         74296        9697928  [C
   2:         68201        2182432  java.util.concurrent.ConcurrentHashMap$Node
   3:         23969        2109272  java.lang.reflect.Method
   4:         72884        1749216  java.lang.String
   5:         12003        1331608  java.lang.Class
   6:          4333        1053184  [B
   7:         21255        1020240  org.aspectj.weaver.reflect.ShadowMatchImpl
   8:         23157         926280  java.util.LinkedHashMap$Entry
   9:           367         785712  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  10:          9937         694520  [Ljava.util.HashMap$Node;
  11:         12237         685272  java.util.LinkedHashMap
  12:         21255         680160  org.aspectj.weaver.patterns.ExposedState
  13:          5530         671240  [I
  14:         11241         601016  [Ljava.lang.Object;
  15:         30008         480128  java.lang.Object
  16:         13388         428416  java.util.HashMap$Node
  17:         11460         242936  [Ljava.lang.Class;
  18:          6168         197376  java.lang.ref.WeakReference
  19:          1836         176256  org.springframework.beans.GenericTypeAwarePropertyDescriptor
  20:          4032         161280  java.lang.ref.SoftReference
  21:          4866         155712  java.util.LinkedList
  22:          4263         154088  [Ljava.lang.String;
  23:          5719         137256  java.util.ArrayList
  24:          1561         124880  java.lang.reflect.Constructor
  25:          2469         118512  java.util.HashMap
  26:          4785         114840  java.beans.MethodRef
  27:          2687         107480  java.util.TreeMap$Entry
  28:          2671         106840  java.util.WeakHashMap$Entry
  29:          1459         105048  org.springframework.core.annotation.AnnotationAttributes
  30:          1317          84288  org.springframework.core.MethodParameter
  31:           474          79632  org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$ConfigurationClassBeanDefinition
  32:          4876          78016  java.util.LinkedHashSet
  33:          3082          73968  java.util.LinkedList$Node
  34:            54          70432  [J
  35:          2414          57936  sun.reflect.generics.tree.SimpleClassTypeSignature
--More--

        也可以将信息保存到指定文件

jmap -histo:live 1570 > 1.txt

        -clstat 类加载统计信息

[root@localhost ~]# jmap -clstats 1570
Attaching to process ID 1570, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness......................................................liveness analysis may be inaccurate ...
class_loader    classes bytes   parent_loader   alive?  type

<bootstrap>     2947    4907464   null          live    <internal>
0x000000008ac844c8      1       894     0x0000000089015a28      dead    sun/reflect/DelegatingClassLoader@0x0000000100009df8
0x000000008a032300      1       1474    0x0000000089015a28      dead    sun/reflect/DelegatingClassLoader@0x0000000100009df8
0x00000000893f6e38      1       1471    0x0000000089015a28      dead    sun/reflect/DelegatingClassLoader@0x0000000100009df8
0x000000008a78e270      1       880     0x0000000089015a28      dead    sun/reflect/DelegatingClassLoader@0x0000000100009df8
0x000000008ac856c0      1       881     0x0000000089015a28      dead    sun/reflect/DelegatingClassLoader@0x0000000100009df8
0x000000008aac70a0      1       880     0x0000000089015a28      dead    sun/reflect/DelegatingClassLoader@0x0000000100009df8
0x00000000893f6730      1       1473    0x0000000089015a28      dead    sun/reflect/DelegatingClassLoader@0x0000000100009df8
0x000000008a78db68      1       880     0x0000000089015a28      dead    sun/reflect/DelegatingClassLoader@0x0000000100009df8
0x000000008ac852d8      1       880     0x0000000089015a28      dead    sun/reflect/DelegatingClassLoader@0x0000000100009df8
0x000000008a23ce30      1       880       null          dead    sun/reflect/DelegatingClassLoader@0x0000000100009df8
0x000000008aac6cb8      1       1474    0x0000000089015a28      dead    sun/reflect/DelegatingClassLoader@0x0000000100009df8
0x000000008ac84bd0      1       1474    0x0000000089015a28      dead    sun/reflect/DelegatingClassLoader@0x0000000100009df8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值