jvm常用命令
jps
显示当前运行的java进程以及相关参数
1 | 命令格式:jps [option] [hostid] |
常用参数
| 参数 | 解释 |
|---|---|
| -q | 只输出LVMID,省略主类的名称 |
| -m | 输出虚拟机进程启动时传给主类main()函数的参数 |
| -l | 输出主类的全类名,如果进程执行的是Jar包,输出Jar路径 |
| -v | 输出虚拟机进程启动时JVM参数 |

jinfo
以输出并修改运行时的java 进程的opts。用处比较简单,就是能输出并修改运行时的java进程的运行参数。用法是jinfo pid
jstat
是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。1
2
3
4
5
6
7
8jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
参数解释:
option — 选项,我们一般使用 -gc 查看gc情况
vmid — VM的进程号,即当前运行的java进程号
interval– 间隔时间,单位为秒或者毫秒
count — 打印次数,如果缺省则打印无数次
例子:jstat -gc 5828 250 5
jstat有如下选项:
| 参数 | 解释 |
|---|---|
| -gc | 监听Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量,以用空间、GC时间合计等信息 |
| -gcutil | 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 |
| -class | 监视类装载、卸载数量、总空间及类装载所耗费的时间 |
| -gccapacity | 监视内容与-gc基本相同,但输出主要关注java堆各个区域使用到的最大和最小空间 |
| -gccause | 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因 |
| -gcnew | 监视新生代GC状况 |
| -gcnewcapacity | 监视内同与-gcnew基本相同,输出主要关注使用到的最大和最小空间 |
| -gcold | 监视老年代GC情况 |
| -gcoldcapacity | 监视内同与-gcold基本相同,输出主要关注使用到的最大和最小空间 |
| -gcpermcapacity | 输出永久代使用到最大和最小空间 |
| -compiler | 输出JIT编译器编译过的方法、耗时等信息 |
| -printcompilation | 输出已经被JIT编译的方法 |
一些输出的解释
| 名称 | 解释 |
|---|---|
| S0C | S0区容量(S1区相同,略) |
| S0U | S0区已使用 |
| EC | E区容量 |
| EU | E区已使用 |
| OC | 老年代容量 |
| OU | 老年代已使用 |
| PC | Perm容量 |
| PU | Perm区已使用 |
| YGC | Young GC(Minor GC)次数 |
| YGCT | Young GC总耗时 |
| FGC | Full GC次数 |
| FGCT | Full GC总耗时 |
| GCT | GC总耗时 |

JVM堆内存布局
jmap
jmap用来查看堆内存使用状况。 语法格式如下:
1 | jmap [option] pid |



jstack
jstack主要用来查看某个Java进程内的线程堆栈信息。语法格式如下:jstack [option] pid
| 参数 | 解释 |
|---|---|
| -F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
| -l | 除堆栈外,显示关于锁的附加信息 |
| -m | 如果调用到本地方法的话,可以显示C/C++的堆栈 |
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多
例子
下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep
找出该进程内最耗费CPU的线程,可以使用top -Hp pid输出如下:
TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为12811的线程,用1
printf "%x\n" 12811
得到12811的十六进制值为320b,用jstack来输出进程12811的堆栈信息,然后根据线程ID的十六进制值grep,如下:1
jstack 12809 | grep '320' -C20