盒子
盒子
文章目录
  1. jvm常用命令
    1. jps
    2. jinfo
    3. jstat
    4. jmap
    5. jstack
    6. 例子

jvm常用命令

jvm常用命令

jps

显示当前运行的java进程以及相关参数

1
命令格式:jps [option] [hostid]  

常用参数

参数 解释
-q 只输出LVMID,省略主类的名称
-m 输出虚拟机进程启动时传给主类main()函数的参数
-l 输出主类的全类名,如果进程执行的是Jar包,输出Jar路径
-v 输出虚拟机进程启动时JVM参数

jvm-1

jinfo

以输出并修改运行时的java 进程的opts。用处比较简单,就是能输出并修改运行时的java进程的运行参数。用法是jinfo pid
jvm-2

jstat

是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

1
2
3
4
5
6
7
8
jstat -<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-3
JVM堆内存布局
jvm-4

jmap

jmap用来查看堆内存使用状况。 语法格式如下:

1
2
3
4
5
jmap [option] pid
jmap -permstat pid 打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息
jmap -heap pid 查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况
jmap -histo[:live] pid 查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象
jmap -dump:format=b,file=文件名 [pid] 导出整个JVM 中内存信息

jmap-1
jmap-2
jmap-3

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输出如下:
jstack-1
TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为12811的线程,用

1
printf "%x\n" 12811

得到12811的十六进制值为320b,用jstack来输出进程12811的堆栈信息,然后根据线程ID的十六进制值grep,如下:
1
jstack 12809 |  grep '320' -C20