jps
- -q 抑制类名,JAR文件名和传递给该
方法的参数的输出,仅生成本地VM标识符的列表。main
- -m 输出传递给main方法的参数。对于嵌入式JVM,输出可能为null。
- -l 将应用程序主类的完整软件包名称或完整路径名称输出到应用程序的JAR文件。
- -v 输出传递给JVM的参数。
- -V 输出通过标志文件(.hotspotrc文件或-XX:Flags = < filename >参数指定的文件)传递给JVM的参数。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxETNzMDOxITM5AzNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
jstat
监视虚拟机运行状态信息:类装载,内存,垃圾收集,jit 编译的信息,依赖 jps 的进程号。
类加载统计:
- S0 Survior0利用率占空间当前容量的百分比。
- S1 Survior1利用率占空间当前容量的百分比。
- E eden空间利用率占空间当前容量的百分比。
- O 老年代利用率占空间当前容量的百分比。
- CCS 压缩类
- M 元空间 JDK1.8开始代替1.7之前的永久代,都是对方法区的事项,区别在于,元空间不在虚拟机中,而是使用本地内存。
- YGC 年轻代GC事件的数量。
- YGCT 年轻代垃圾收集时间。
- FGC FullGC事件的数量。
- FGCT FullGC垃圾收集时间。
- GCT 垃圾收集总时间。
1000间隔毫秒数 10 监控10次
其他:
- -gacapacity 内存池生成和空间容量
- -gccause 此选项显示与-gcutil选项相同的垃圾收集统计信息摘要,但包括上一个垃圾收集事件和(如果适用)当前垃圾收集事件的原因
- -gcnew 新一代统计
- -gcnewcapacity 新一代空间大小统计
- -gcold 老年人代和永久代统计
- -gcoldcapacity 上一代统计
- -gcpermcapacity 永久世代统计
- -gcutil 垃圾收集统计摘要
- -gcutil 垃圾收集统计摘要
jinfo
实时查看和调整虚拟机的各项参数
- -flag <name> 查看虚拟机参数
- -flag [+|-]<name> 调整虚拟机参数
- -flag <name>=<value> 设置虚拟机参数
- -flags 打印虚拟机参数
- -sysprops 打印java系统参数
- <no option> to print both of the above
- -h | -help to print this help message
jmap
主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。
- -dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
- -finalizerinfo 打印正等候回收的对象的信息.
- -heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
- -histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
- -permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
jmap工具有一部分命令仅限于Linux和Solaris平台,而Windows平台下能够使用的命令只有“jmap -histo<pid>”和“jmap -dump:<dump-options><pid>”。不过一般来说,使用命令“jmap -dump:<dump-options><pid>”生成dump文件应该是最常用的命令之一,由于生成dump文件时比较耗时的,因此大家需要耐心等待,尤其是大内存镜像生成dump文件则需要耗费更长的时间来完成。
jhat
分析bin文件会让内存占用率非常高,一般不会直接在服务器上做分析。
jstack
生成虚拟机内线程快照,定位线程长时间原因。
-
执行线程转储-F
-
打印java和本地帧-m
-
打印列表信息,包括锁相关的信息-l
线程状态
- NEW,未启动的。不会出现在Dump中。
- RUNNABLE,在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。
- BLOCKED,受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。
- WATING,无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。
- TIMED_WATING,有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。
- TERMINATED,已退出的。
调用修饰
- 表示线程在调用的时候的额外的重要的操作,线程dump分析的重要信息
- locked <地址> 使用synchronized申请对象锁成功后,监视器的拥有者
- waiting to lock <地址>使用synchronized申请锁对象失败,在进入区等待
- waiting on <地址>使用synchronized申请锁对象成功后,在等待区等待
- parking to wait for <地址>调用了park方法
使用实例
jstack查看线程具体在做什么,查看哪些线程在长时间占用cpu,尽快发现问题和解决问题
a.用top命令查看进程消耗cpu的情况,查看消耗高的进程来分析。
top - 23:03:18 up 48 days, 2:07, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 99 total, 1 running, 98 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.8 us, 0.7 sy, 0.0 ni, 98.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8010460 total, 459580 free, 5867196 used, 1683684 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1809732 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18602 root 20 0 2808772 281956 13840 S 0.7 3.5 6:22.06 java
27484 root 20 0 2947772 417468 14152 S 0.7 5.2 2:52.65 java
32473 root 20 0 2872624 332384 13944 S 0.7 4.1 37:09.33 java
1243 mysql 20 0 1621728 363796 5944 S 0.3 4.5 29:41.37 mysqld
1512 root 20 0 3644460 366936 13808 S 0.3 4.6 21:18.60 java
b.我们可以看到18602的进程消耗cpu比价高,于是可以分析该进程下的线程的使用情况。在控制台输入 top -Hp 18602,如下所示
18603 root 15 0 1807m 630m 9492 S 1.3 4.0 0:05.12 java
20503 root 15 0 1360m 560m 9176 S 0.3 3.6 0:46.72 java
我们来分析18603线程,并且注意18603的线程是属于18602进程的。
输入
jstack 18602 | grep -A 10 [线程的16进制]
即jstack 18602 | grep -A 10 48ab,得到如下结果
[[email protected] ~]# jstack 18602 | grep -A 10 48ab
"DestroyJavaVM" #28 prio=5 os_prio=0 tid=0x00007f119cb24000 nid=0x48ab waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"New I/O server boss #4" #24 daemon prio=5 os_prio=0 tid=0x00007f119d1c6000 nid=0x48c4 runnable [0x00007f1158912000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked <0x00000000f28b7538> (a sun.nio.ch.Util$3)
- locked <0x00000000f28b7548> (a java.util.Collections$UnmodifiableSet)