目录
例题一:某服务器CPU使用率达到99%,排查是哪个程序的哪个线程导致的高CPU。
例题二、某java应用大量消耗内存,导致OutOfMemoryError
一、Java命令
作为一个合格的开发人员,不仅要能写好代码,还有一项很重要的技能就是排查问题。这里提到的排查问题不仅仅是在coding的过程中debug等,还包括线上问题的排查。由于在生产环境中,一般没办法debug,所以我们需要借助一些常用命令来查看运行时的具体情况,这些运行时信息包括但不限于运行日志、异常堆栈、堆使用情况、GC情况、JVM参数情况、线程情况等。
本文介绍常用的Java命令,这些命令都是被存放在JDK安装目录的bin目录中,以下来介绍相关命令以及具体使用方式。
1、jps:显示所有java进程pid
jps(Java Virtual Machine Process Status Tool)是JDK1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单查看当前java进程的一些简单情况。
jps类似linux/unix平台上的ps命令,但是jps只查找所有的Java应用程序,包括即使没有使用java执行体的程序(例如:定制的启动器)。另外,jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。
学习一个命令,首先查看帮助:
jps -help
- 参数介绍
-q 只显示pid,不显示class名称,jar文件名和传递给main方法的参数
-m 输出传递给main方法的参数,在嵌入式jvm上可能是null
-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名
-v 输出传递给JVM的参数
- 常用命令
jps:显示当前用户的所有java进程的PID
jps -v 3331:显示虚拟机参数
jps -m 3331:显示传递给main()函数的参数
jps -l 3331:显示主类的全路径
2、jinfo:实时查看和调整虚拟机参数
配置信息包括JAVA系统参数和命令行参数,如果运行在64位虚拟机上运行,需要指定-J-d64参数,如:jinfo -J-d64 -sysprops pid
由于打印jvm常用信息可以使用Jps命令,并且在后续的java版本中可能不再支持(注:jdk8中已经不支持该命令)
查看帮助:jinfo -help
- 常用命令
Jinfo -flag CMSIniniatingOccupancyFration 1444:查询
CMSIniniatingOccupancyFration参数值
3、jstat:监控虚拟机各种运行状态信息
jstat(JVM Statistic Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。
查看帮助:jstat -help
利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
- 参数解释
Option -选项,我们一般使用 -gcutil 查看gc情况
vmid -VM的进程号,即当前运行的java进程号
interval -间隔时间,单位为秒或毫秒
count -打印次数,如果缺省则打印无数次
注意:参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次
假设需要每250毫秒查询一次进程5828垃圾收集状况,一共查询5次,命令行如下:
jstat -gc 5828 250 5
- option:
选项option代表这用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集呵呵运行期编译状况,具体选项及作用如下:
-class 监视类装载、卸载数量、总空间及类装载所耗费的时间
-gc 监视Java堆状况,包括Eden区、2个Survivor区、老年代、永久代等的容量
-gccapacity 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大和最小空间
-gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
-gcnewcapacity 监视内容与-gcnew基本相同,输出主要关注使用到的最大和最小空间
-gcold 监视老年代GC的状况
-gcoldcapacity 监视内容与 -gcold基本相同,输出主要关注使用到的最大和最小空间
-gcpermcapacity 输出永久代使用到的最大和最小空间
-compiler 输出JIT编译器编译过的方法、耗时等信息
-printcompilation 输出已经被JIT编译的方法
- 常用指令
jstat -class<pid>:显示加载class的数量,及所占空间等信息
Loaded 装载的类的数量
Bytes 装载类所占用的字节数
Unloaded 卸载类的数量
Time 装载和卸载类所花费的时间
jstat -compiler <pid>:显示VM实时编译的数量等信息
Compiled 编译任务执行数量
Failed 编译任务执行失败数量
Invalid 编译任务执行失效数量
Time 编译任务消耗时间
FailedType 最后一个编译失败任务的类型
FailedMethod 最后一个编译失败任务所在的类及方法
jstat -gc <pid>:可以显示gc的信息,查看gc的次数,及时间
S0C 年轻代中第一个survivor(幸存区)的容量(字节)
S1C 年轻代中第二个surviror(幸存区)的容量(字节)
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所用时间(s)
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)
jstat