JVM调优工具
jdk version = 1.8
Linux命令
查看服务器资源使用情况:top。
查看指定进程的各线程资源占用:top -Hp <pid>
10进制转16进制输出:printf "%x\n" <tid>
java
启动一个java进程的方法:
java [options] class [args...]
or
java [options] -jar jarfile [args...]
- options是JVM参数
- args是main方法的参数列表
jps
查看运行的jvm进程状态信息。语法格式:
jps [options] [<hostid>]
-
hostid: jps支持远程调用,如果不指定hostid就默认为当前主机或服务器。
-
options:
-
-q:只输出进程id
-
-m:输出main方法的参数
-
-l:输出main类或jar的全限定名
-
-v:输出jvm参数
-
jstack
查看线程堆栈信息。语法格式:
jstack [option] <pid>
option:
- -l:额外打印锁信息
- -m:混合模式,同时打印虚拟机栈和本地栈
- -F:强制打印线程堆栈,线程挂起时使用
jmap
查看堆内存使用情况。语法格式:
jmap [option] <pid>
option:
-
-heap:打印堆的概要信息
-
-dump:<dump-options>:转储堆内存为hprof二进制格式
- live:仅转储活对象
- format=b:二进制格式
- file=<file>:转储到指定文件
例如:
jmap -dump:live,format=b,file=./heap.bin <pid> -
-histo[:live]:打印堆内存中的对象数目、大小统计直方图。带上live表示只统计活对象
-
-finalizerinfo:打印正等候回收的对象信息
jstat
jvm统计监控工具。
gc统计:
jstat -gc <pid> <internal> <times>
# internal: 间隔时间ms
# times: 次数
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
# C: capacity, U: usage
jstat -gcutil <pid>
S0 # S0使用率
S1 # S1使用率
E # Eden使用率
O # 老年代使用率
M # 元数据使用率
CCS # 压缩类空间使用率
YGC # young gc次数
YGCT # young gc总时间
FGC # full gc次数
FGCT # full gc总时间
GCT # gc总时间
其它jstat选项:
-class # 类加载统计
-compiler # 编译统计
-gccause # 上一次gc原因
-gccapacity # 堆内存容量统计
-gcnew # 新生代gc统计
-gcnewcapacity # 新生代gc容量统计
-gccold # 老年代gc统计
-gcoldcapacity # 老年代gc容量统计
-gcmetacapacity # 元数据区容量统计
-printcompilation # JVM编译方法统计
JVM运行时数据区

MetaSpace: M,包括指针压缩空间;指针压缩空间: CCS。
GC时间
[Times: user=0.00 sys=0.00, real=0.01 secs]:这里user,sys和real与linux的time命令所输出的时间含义一致,分别代表用户态消耗的cpu时间、内核态消耗的cpu时间和操作从开始到结束经历的墙钟时间(Wall Clock Time)。墙钟时间包括了非运算时间,例如IO等待、线程阻塞。
多核cpu时,多线程操作会叠加这些cpu的时间(墙钟时间不会叠加),所以user或sys时间大于real时间是完全正常的。