性能调优命令
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 | [hostid]:远程服务器地址,jps 支持远程调用 |
示例
jps
无参数:显示进程的ID 和 类的名称
1 | C:\Users\baiyu>jps |
jps -q
参数 -q 只输出进程ID,而不显示出类的名称
1 | C:\Users\baiyu>jps -q |
jps -m
参数 -m 可以输出传递给 Java 进程(main 方法)的参数
1 | C:\Users\baiyu>jps -m |
jps -l
参数 -l 可以输出主函数的完整路径(类的全路径)。
1 | C:\Users\baiyu>jps -l |
jps -v
参数 -v 可以显示传递给 Java 虚拟机的参数。
1 | C:\Users\baiyu>jps -v |
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 | C:\Users\baiyu>jinfo 12492 |
-flag name
命令:jinfo -flag name pid
描述:输出对应名称的参数
1 | C:\Users\baiyu>jinfo -flag PrintGC 12492 |
使用该命令,可以查看指定的 jvm 参数的值。如:查看当前 jvm 进程是否开启打印 GC 日志。
-flag [+|-]name
命令:jinfo -flag [+|-]name pid
描述:开启或者关闭对应名称的参数使用 jinfo 可以在不重启虚拟机的情况下,可以动态的修改 jvm 的参数。尤其在线上的环境特别有用。
1 | C:\Users\baiyu>jinfo -flag +PrintGC 12492 |
-flag name=value
命令:jinfo -flag name=value pid
描述:修改指定参数的值。同示例三,但示例三主要是针对 boolean 值的参数设置的。
如果是设置 value值,则需要使用 name=value 的形式。
jinfo虽然可以在java程序运行时动态地修改虚拟机参数,但并不是所有的参数都支持动态修改
-flags
命令:jinfo -flags pid
描述:输出全部的参数
1 | C:\Users\baiyu>jinfo -flags 12492 |
-sysprops
命令:jinfo -sysprops pid
描述:输出当前 jvm 进行的全部的系统属性
1 | C:\Users\baiyu>jinfo -sysprops 12492 |
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 | C:\Users\baiyu>jstack -l 12492 |
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 | C:\Users\baiyu>jmap 12492 |
heap
命令:jmap -heap pid
描述:显示Java堆详细信息打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息
1 | C:\Users\baiyu>jmap -heap 12492 |
histo[:live]
命令:jmap -histo:live pid
描述:显示堆中对象的统计信息其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。
clstats
命令:jmap -clstats pid
描述:打印类加载器信息-clstats是-permstat的替代方案,在JDK8之前,-permstat用来打印类加载器的数据
打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。
finalizerinfo
命令:jmap -finalizerinfo pid
描述:打印等待终结的对象信息
1 | C:\Users\baiyu>jmap -finalizerinfo 12492 |
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 | C:\Users\baiyu>jmap -dump:format=b,file=heapdump.phrof 12492 |
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 | C:\Users\baiyu>jhat C:\Users\baiyu\heapdump.phrof |