JVM调优工具

1,539 阅读2分钟

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...]
  1. options是JVM参数
  2. args是main方法的参数列表

jps

查看运行的jvm进程状态信息。语法格式:

jps [options] [<hostid>]
  1. hostid: jps支持远程调用,如果不指定hostid就默认为当前主机或服务器。

  2. 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时间是完全正常的。