jvm系列(四)——jvm调优(命令行)

命令概述

Sun JDK监控和故障处理命令有jps、jstat、jmap、jhat、jstack、jinfo

{
    "jps": JVM Process Status Tool,显示制定系统内所有的HotSpot虚拟机进程,
    "jstat": JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据,
    "jinfo": Configuration Info for Java,显示虚拟机配置信息,
    "jmap": Memory Map for Java,生成虚拟机的内存转储快照(heapdump文件),
    "jhat": JVM Heap Dump Browser,用于分析heapdump文件,他会建立一个HTTP/HTML 服务区,让用户可以再浏览器上查看分析结果,
    "jstack": Stack Trace for Java,显示虚拟机的线程快照
}.

jps

jps [options] [hostid]
option参数
-q : 只输出LVMID,省略主类名称
-m : 输出虚拟机启动时传递给主类main()的参数
-l : 输出主类全名,如果进程是jar包,输出jar包路径
-v : 输出虚拟机进程启动时JVM参数

其中[option]、[hostid]参数也可以不写。

示例

jps -l -m
22336 org.jetbrains.jps.cmdline.Launcher /Applications/...
20609 org.jetbrains.idea.maven.server.RemoteMavenServer
22337 com.lls.it.luc.LucApplication
6154 /Users/fitz.bai/Documents/file-api-0.0.1-SNAPSHOT.jar

jstat

命令格式
jstat [option] LVMID [interval] [count]
参数
[option] : 操作参数
LVMID : 本地虚拟机进程ID
[interval] : 查询的时间间隔
[count] : 查询次数
class: 监视类的行为的时间
gc: 垃圾回收堆的行为统计,包括Java堆的几个代等信息
gccapacity: 与gc差不多,输出主要是java堆各个区的空间使用信息
gcutil: 与gc差不多,输出主要是已使用空间占总空间的百分比
gccause: 与gcutil差不多,会额外输出导致上一次GC的原因
gcnew: 监视新生代GC情况
gcold: 监视年老代GC情况
gcoldcapacity: 与gcold差不多,输出关注使用到的最大最小空间
gcpermcapacity: 输出永久代使用的最大最小空间
compiler: 输出JIT编译器编译过的方法,耗时等信息
printcompilation: 输出已经被JIT编译的方法
示例
jstat -class 6154
Loaded  Bytes  Unloaded  Bytes     Time
8089   14273.9    0       0.0      5.27

Loaded : 加载class的数量
Bytes : class字节大小
Unloaded : 未加载class的数量
Bytes : 未加载class的字节大小
Time : 加载时间

===========================================================
jstat -compiler 6154
Compiled Failed Invalid   Time   FailedType FailedMethod
  4614      1      0      14.42      1      java/util/concurrent/ConcurrentHashMap putVal

Compiled : 编译数量
Failed : 编译失败数量
Invalid : 无效数量
Time : 编译耗时
FailedType : 失败类型
FailedMethod : 失败方法的全限定名

===========================================================
jstat -gc 6154
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
 0.0   2048.0  0.0   2048.0 162816.0  35840.0   97280.0    16358.8 41600.0 40417.5 5248.0 4770.4   6     0.184    0    0.000    0.184

S0C : survivor0区的总容量
S1C : survivor1区的总容量
S0U : survivor0区已使用的容量
S1U : survivor1区已使用的容量
EC : Eden区的总容量
EU : Eden区已使用的容量
OC : Old区的总容量
OU : Old区已使用的容量
PC  当前perm的容量 (KB)
PU  perm的使用 (KB)
YGC : 新生代垃圾回收次数
YGCT : 新生代垃圾回收时间
FGC : 老年代垃圾回收次数
FGCT : 老年代垃圾回收时间
GCT : 垃圾回收总消耗时间

===========================================================

 jstat -gccause 6154
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT       LGCC                 GCC
 0.00 100.00  22.01  16.82  97.16  90.90    6      0.184    0    0.000    0.184 G1 Evacuation Pause    No GC

 LGCC:最近垃圾回收的原因
 GCC:当前垃圾回收的原因
jstat -gcnew 6154
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
 0.0   2048.0  0.0   2048.0  1  15 1536.0 162816.0  35840.0   6      0.184

 TT:Tenuring threshold(提升阈值)
 MTT:最大的tenuring threshold
 DSS:survivor区域大小 (KB)
===========================================================

jstat -gcnewcapacity 6154
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC
   0.0     4194304.0   164864.0    0.0      0.0   4194304.0   2048.0  4194304.0   162816.0   6     0

NGC:当前年轻代的容量 (KB)
S0CMX:最大的S0空间 (KB)
S0C:当前S0空间 (KB)
ECMX:最大eden空间 (KB)
EC:当前eden空间 (KB)

其他的大家可以自己尝试一下,这些是经常使用的

jmap

命令格式
jmap [option] LVMID
option参数
dump: 生成堆转储快照
finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
heap: 显示Java堆详细信息
histo: 显示堆中对象的统计信息
permstat: o print permanent generation statistics
F: 当-dump没有响应时,强制生成dump快照

jhat

jhat(JVM Heap Analysis Tool)命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。

命令格式
jhat [dumpfile]

jstack

用于生成java虚拟机当前的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

命令格式
jstack [option] LVMID
option参数
F: 当正常输出请求不被响应时,强制输出线程堆栈
l: 除堆栈外,显示关于锁的附加信息
m: 如果调用到本地方法的话,可以显示C/C++的堆栈
示例
jstack -l 6154|more
2018-08-21 16:27:59
Full thread dump Java HotSpot(TM) 64-Bit Server VM (10.0.1+10 mixed mode):

Threads class SMR info:
_java_thread_list=0x00007fb9c0f44970, length=28, elements={
0x00007fb9c1810000, 0x00007fb9c2012000, 0x00007fb9c2846000, 0x00007fb9c1814000,
0x00007fb9c2846800, 0x00007fb9c200d800, 0x00007fb9c2013800, 0x00007fb9c2819000,
0x00007fb9c1833800, 0x00007fb9c2d12000, 0x00007fb9c1cca800, 0x00007fb9c27f7000,
0x00007fb9c3f28800, 0x00007fb9c14ce800, 0x00007fb9c2c93000, 0x00007fb9c6626000,
0x00007fb9c23be000, 0x00007fb9c5d11000, 0x00007fb9c3e51000, 0x00007fb9c1c91000,
0x00007fb9c1319800, 0x00007fb9c131c000, 0x00007fb9c1e9c000, 0x00007fb9c1ebb800,
0x00007fb9c7dae800, 0x00007fb9c1233800, 0x00007fb9c751b000, 0x00007fb9c64f8800
}

"Reference Handler" #2 daemon prio=10 os_prio=31 tid=0x00007fb9c1810000 nid=0x4203 waiting on condition  [0x0000700005720000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ref.Reference.waitForReferencePendingList(java.base@10.0.1/Native Method)
        at java.lang.ref.Reference.processPendingReferences(java.base@10.0.1/Unknown Source)
        at java.lang.ref.Reference.access$000(java.base@10.0.1/Unknown Source)
        at java.lang.ref.Reference$ReferenceHandler.run(java.base@10.0.1/Unknown Source)

   Locked ownable synchronizers:
        - None

详细介绍jstack的ushuch内容

jinfo

命令格式
jinfo [option] [args] LVMID
option参数
-flag: 输出指定args参数的值
-flags: 不需要args参数,输出所有JVM参数的值
-sysprops: 输出系统属性,等同于System.getProperties()
示例
jinfo 22336
Java System Properties:
#Tue Aug 21 16:33:47 CST 2018
java.vendor=Oracle Corporation
preload.project.path=/Users/fitz.bai/luc-api
.........

总结

以上就是jvm调优的一些命令,大家可以一个一个试一试,研究一下输出的内容,加深对JVM的理解。

猜你喜欢

转载自blog.csdn.net/qq_22798455/article/details/81910113