抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

性能调优命令

JVM监控和调优

​ 在Java应用和服务出现莫名的卡顿、CPU飙升等问题时总是要分析一下对应进程的JVM状态以定位问题和解决问题并作出相应的优化,在这过程中Java自带的一些状态监控命令和图形化工具就非常方便了,在linux环境下有可能不支持图形界面,命令的方式就很重要了。

jps

Java版的ps命令,查看java进程及其相关的信息,如果你想找到一个java进程的pid,那可以用jps命令替代linux中的ps命令了,简单而方便 。

命令格式

jps [options] [hostid]

options参数解释:

  • -l : 输出主类全名或jar路径
  • -q : 只输出LVMID
  • -m : 输出JVM启动时传递给main()的参数
  • -v : 输出JVM启动时显示指定的JVM参数
  • -V:输出通过flag文件传递到JVM中的参数
1
2
[hostid]:远程服务器地址,jps 支持远程调用
[protocol:][[//]hostname][:port][/servername]

示例

jps

无参数:显示进程的ID 和 类的名称

1
2
3
4
C:\Users\baiyu>jps
24884
6692 Jps
12492 Launcher
jps -q

参数 -q 只输出进程ID,而不显示出类的名称

1
2
3
4
C:\Users\baiyu>jps -q
2096
24884
12492
jps -m

参数 -m 可以输出传递给 Java 进程(main 方法)的参数

1
2
3
4
C:\Users\baiyu>jps -m
24884
26264 Jps -m
12492 Launcher D:/Program Files/JetBrains/IntelliJ IDEA 2019.1.3/lib/aether-api-1.1.0.jar;D:/Program Files/JetBrains/IntelliJ IDEA 2019.1.3/lib/aether-connector-basic-1.1.0.jar;D:/Program Files/JetBrains/IntelliJ IDEA 2019.1.3/lib/lz4-1.3.0.jar;D:/Program Files/JetBrains/IntelliJ IDEA 2019.1.3/lib/guava-25.1-jre.jar;D:/Program Files/JetBrains/IntelliJ IDEA 2019.1.3/lib/maven-model-builder-3.3.9.jar;D:/Program Files/JetBrains/IntelliJ IDEA 2019.1.3/lib/netty-codec-4.1.32.Final.jar;D:/Program Files/JetBrains/IntelliJ IDEA 2019.1.3/lib/maven-builder-support-3.3.9.jar;D:/Program Files/JetBrains/IntelliJ IDEA 2019.1.3/lib/netty-transport-4.1.32.Final.jar;D:/Program Files/JetBrains/IntelliJ IDEA 2019.1.3/lib/forms-1.1-preview.jar;D:/Program Files/JetBrains/IntelliJ IDEA 2019.1.3/lib/aether-dependency-resolver.jar;D:/Program Files/JetBrains/IntelliJ IDEA 2019.1.3/lib/idea_rt.jar;D:/Program Files/JetBrains/IntelliJ IDEA 2019.1.3/lib/jps-builders-6.jar;D:/Program Files/JetBrains/IntelliJ IDEA 2019.
jps -l

参数 -l 可以输出主函数的完整路径(类的全路径)。

1
2
3
4
C:\Users\baiyu>jps -l
24884
12492 org.jetbrains.jps.cmdline.Launcher
17356 sun.tools.jps.Jps
jps -v

参数 -v 可以显示传递给 Java 虚拟机的参数。

1
2
C:\Users\baiyu>jps -v
22304 Jps -Denv.class.path= .;C:\Program Files\Java\jdk1.8.0_191\lib;C:\Program Files\Java\jdk1.8.0_191\lib\tools.jar -Dapplication.home=C:\Program Files\Java\jdk1.8.0_191 -Xms8m

jinfo

jinfo 是 JDK 自带的命令,可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息

参数说明

  • pid 对应jvm的进程id
  • executable core 产生core dump文件
  • [server-id@]remote server IP or hostname 远程的ip或者hostname,server-id标记服务的唯一性id

命令格式

**jinfo [option] **

options参数解释:

  • -flag 打印指定名称的参数
  • -flag [+|-] 打开或关闭参数
  • -flag = 设置参数
  • -flags 打印所有参数
  • -sysprops 打印系统配置
  • 打印上面两个选项

Javacore 概述

​ Javacore,也可以称为“threaddump”或是“javadump”,它是 Java 提供的一种诊断特性,能够提供一份可读的当前运行的 JVM 中线程使用情况的快照。即在某个特定时刻,JVM 中有哪些线程在运行,每个线程执行到哪一个类,哪一个方法。
应用程序如果出现不可恢复的错误或是内存泄露,就会自动触发 Javacore 的生成。

示例

no option

命令:jinfo pid
描述:输出当前 jvm 进程的全部参数和系统属性

1
2
3
4
5
6
C:\Users\baiyu>jinfo 12492
Attaching to process ID 12492, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
Java System Properties:
-flag name

命令:jinfo -flag name pid
描述:输出对应名称的参数

1
2
C:\Users\baiyu>jinfo -flag PrintGC 12492
-XX:-PrintGC

使用该命令,可以查看指定的 jvm 参数的值。如:查看当前 jvm 进程是否开启打印 GC 日志。

-flag [+|-]name

命令:jinfo -flag [+|-]name pid
描述:开启或者关闭对应名称的参数

使用 jinfo 可以在不重启虚拟机的情况下,可以动态的修改 jvm 的参数。尤其在线上的环境特别有用。

1
2
3
4
C:\Users\baiyu>jinfo -flag +PrintGC 12492

C:\Users\baiyu>jinfo -flag PrintGC 12492
-XX:+PrintGC
-flag name=value

命令:jinfo -flag name=value pid
描述:修改指定参数的值。

同示例三,但示例三主要是针对 boolean 值的参数设置的。
如果是设置 value值,则需要使用 name=value 的形式。

jinfo虽然可以在java程序运行时动态地修改虚拟机参数,但并不是所有的参数都支持动态修改

-flags

命令:jinfo -flags pid
描述:输出全部的参数

1
2
3
4
5
C:\Users\baiyu>jinfo -flags 12492
Attaching to process ID 12492, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
-sysprops

命令:jinfo -sysprops pid
描述:输出当前 jvm 进行的全部的系统属性

1
2
3
4
5
C:\Users\baiyu>jinfo -sysprops 12492
Attaching to process ID 12492, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12

jstat

jstat命令是使用频率比较高的命令,主要用来查看JVM运行时的状态信息,包括内存状态、垃圾回收等。

命令格式

jstat [option] LVMID [interval] [count]

其中LVMID是进程id,interval是打印间隔时间(毫秒),count是打印次数(默认一直打印)

option参数解释

  • -class class loader的行为统计
  • -compiler HotSpt JIT编译器行为统计
  • -gc 垃圾回收堆的行为统计
  • -gccapacity 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计
  • -gcutil 垃圾回收统计概述
  • -gccause 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
  • -gcnew 新生代行为统计
  • -gcnewcapacity 新生代与其相应的内存空间的统计
  • -gcold 年老代和永生代行为统计
  • -gcoldcapacity 年老代行为统计
  • -gcpermcapacity 永生代行为统计
  • -printcompilation HotSpot编译方法统计

常用命令

jstat -gc 12492 5000

即会每5秒一次显示进程号为12492 的java进成的GC情况

结果说明

显示内容说明如下(部分结果是通过其他其他参数显示的,暂不说明):

​ S0C:年轻代中第一个survivor(幸存区)的容量 (字节)

​ S1C:年轻代中第二个survivor(幸存区)的容量 (字节)

​ S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)

​ S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)

​ EC:年轻代中Eden(伊甸园)的容量 (字节)

​ EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)

​ OC:Old代的容量 (字节)

​ OU:Old代目前已使用空间 (字节)

​ PC:Perm(持久代)的容量 (字节)

​ PU:Perm(持久代)目前已使用空间 (字节)

​ YGC:从应用程序启动到采样时年轻代中gc次数

​ YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)

​ FGC:从应用程序启动到采样时old代(全gc)gc次数

​ FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)

​ GCT:从应用程序启动到采样时gc用的总时间(s)

​ NGCMN:年轻代(young)中初始化(最小)的大小 (字节)

​ NGCMX:年轻代(young)的最大容量 (字节)

​ NGC:年轻代(young)中当前的容量 (字节)

​ OGCMN:old代中初始化(最小)的大小 (字节)

​ OGCMX:old代的最大容量 (字节)

​ OGC:old代当前新生成的容量 (字节)

​ PGCMN:perm代中初始化(最小)的大小 (字节)

​ PGCMX:perm代的最大容量 (字节)

​ PGC:perm代当前新生成的容量 (字节)

​ S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比

​ S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比

​ E:年轻代中Eden(伊甸园)已使用的占当前容量百分比

​ O:old代已使用的占当前容量百分比

​ P:perm代已使用的占当前容量百分比

​ S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)

​ S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)

​ ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)

​ DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)

​ TT: 持有次数限制

​ MTT : 最大持有次数限制

jstack

jstack是用来查看JVM线程快照的命令,线程快照是当前JVM线程正在执行的方法堆栈集合。使用jstack命令可以定位线程出现长时间卡顿的原因,例如死锁,死循环等。jstack还可以查看程序崩溃时生成的core文件中的stack信息。

命令格式

jstack [-l] (连接运行中的进程)
jstack -F [-m] [-l] (连接挂起的进程)
jstack [-m] [-l] (连接core文件)
jstack [-m] [-l] [server_id@] (连接远程debug服务器)

option参数解释

  • -F 当使用jstack 无响应时,强制输出线程堆栈。
  • -m 同时输出java和本地堆栈(混合模式)
  • -l 额外显示锁信息

常用示命令

1
2
3
4
5
6
7
8
C:\Users\baiyu>jstack -l 12492
2019-10-18 20:10:38
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.191-b12 mixed mode):

"DestroyJavaVM" #13 prio=5 os_prio=0 tid=0x00000000029a8000 nid=0x3598 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:

jmap

jmap是用来生成堆dump文件和查看堆相关的各类信息的命令,例如查看finalize执行队列,heap的详细信息和使用情况。

命令格式

jmap [option] (连接正在执行的进程)
jmap [option] (连接一个core文件)
jmap [option] [server_id@] (链接远程服务器)

参数

  • option: 选项参数。
  • pid: 需要打印配置信息的进程ID。
  • executable: 产生核心dump的Java可执行文件。
  • core: 需要打印配置信息的核心文件。
  • server-id 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
  • remote server IP or hostname 远程调试服务器的IP地址或主机名。

option 参数解释

  • to print same info as Solaris pmap
  • -heap 打印java heap摘要
  • -histo[:live] 打印堆中的java对象统计信息
  • -clstats 打印类加载器统计信息
  • -finalizerinfo 打印在f-queue中等待执行finalizer方法的对象
  • -dump: 生成java堆的dump文件

      dump-options:

      live 只转储存活的对象,如果没有指定则转储所有对象

      format=b 二进制格式

      file= 转储文件到

  • -F 强制选项

示例

no option

命令:jmap pid
描述:查看进程的内存映像信息,类似 Solaris pmap 命令。

使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。这与Solaris的pmap工具比较相似。

1
2
3
4
5
6
7
8
9
10
11
C:\Users\baiyu>jmap 12492
Attaching to process ID 12492, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
0x0000000054000000 68K C:\Program Files\Java\jdk1.8.0_191\jre\bin\nio.dll
0x0000000054020000 104K C:\Program Files\Java\jdk1.8.0_191\jre\bin\net.dll
0x0000000054070000 88K C:\Program Files\Java\jdk1.8.0_191\jre\bin\zip.dll
0x0000000054090000 164K C:\Program Files\Java\jdk1.8.0_191\jre\bin\java.dll
0x00000000540c0000 60K C:\Program Files\Java\jdk1.8.0_191\jre\bin\verify.dll
0x00000000540d0000 8848K C:\Program Files\Java\jdk1.8.0_191\jre\bin\server\jvm.dl
heap

命令:jmap -heap pid
描述:显示Java堆详细信息

打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息

1
2
3
4
5
6
7
8
9
10
C:\Users\baiyu>jmap -heap 12492
Attaching to process ID 12492, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
histo[:live]

命令:jmap -histo:live pid
描述:显示堆中对象的统计信息

其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。

clstats

命令:jmap -clstats pid
描述:打印类加载器信息

-clstats是-permstat的替代方案,在JDK8之前,-permstat用来打印类加载器的数据
打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。

finalizerinfo

命令:jmap -finalizerinfo pid
描述:打印等待终结的对象信息

1
2
3
4
5
6
C:\Users\baiyu>jmap -finalizerinfo 12492
Attaching to process ID 12492, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
Number of objects pending for finalization: 0

Number of objects pending for finalization: 0 说明当前F-QUEUE队列中并没有等待Fializer线程执行final

dump:

命令:jmap -dump:format=b,file=heapdump.phrof pid
描述:生成堆转储快照dump文件。

​ 以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件。

这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。

1
2
3
C:\Users\baiyu>jmap -dump:format=b,file=heapdump.phrof 12492
Dumping heap to C:\Users\baiyu\heapdump.phrof ...
Heap dump file created

jhat

jhat是用来分析jmap生成dump文件的命令,jhat内置了应用服务器,可以通过网页查看dump文件分析结果,jhat一般是用在离线分析上。

命令格式

jhat [option] [dumpfile]

option参数解释

  • -stack false: 关闭对象分配调用堆栈的跟踪
  • -refs false: 关闭对象引用的跟踪
  • -port : HTTP服务器端口,默认是7000
  • -debug : debug级别

   0: 无debug输出

   1: Debug hprof file parsing

   2: Debug hprof file parsing, no server

  • -version 分析报告版本

常用命令

jhat dump.hprof

1
2
3
4
5
6
7
8
9
10
C:\Users\baiyu>jhat C:\Users\baiyu\heapdump.phrof
Reading from C:\Users\baiyu\heapdump.phrof...
Dump file created Fri Oct 18 20:24:40 CST 2019
Snapshot read, resolving...
Resolving 203389 objects...
Chasing references, expect 40 dots........................................
Eliminating duplicate references........................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

访问 http://localhost:7000/

评论