JVM性能调优工具
# JVM 性能调优工具
JDK本身提供了很多方便的 JVM 性能调优监控工具,除了集成式的 VisualVM 和 jConsole 外,还有 jps、jstack、jmap、jhat、jstat、hprof 等小巧的工具,每一种工具都有其自身的特点,用户可以根据你需要检测的应用或者程序片段的状况,适当的选择相应的工具进行检测。
命令 | 作用 |
---|---|
jps | 基础工具 |
jstack | 查看某个Java进程内的线程堆栈信息 |
jmap | jmap导出堆内存,然后使用jhat来进行分析 |
jhat | jmap导出堆内存,然后使用jhat来进行分析 |
jstat | JVM统计监测工具 |
hprof | hprof能够展现CPU使用率,统计堆内存使用情况 |
# 1. jps
JDK提供的一个可以列出正在运行的 JVM 的进程信息的命令行工具,它可以显示 Java 虚拟机进程的执行主类(Main Class,main()函数所在的类)名称、本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)等信息。
[root@ls ~]# jps
2227 lecture-user-0.0.1-SNAPSHOT.jar
36055 jar
2375 lecture-order-0.0.1-SNAPSHOT.jar
2376 lecture-oss-0.0.1-SNAPSHOT.jar
1708 Jps
2
3
4
5
6
# 2. jstack
jstack 主要用来查看某个 Java 进程内的线程堆栈信息
命令:jstack [options] pid
options 为 jstack 命令的可选参数。如果没有指定这个参数,jstack 命令会显示 Java 虚拟机当前时刻的线程快照信息。
- -l:除堆栈外,显示锁的附加信息
- -F:当请求不被响应时,强制输出线程堆栈
- -m:混合模式,打印 java 和本地 C++ 调用的堆栈信息
# 3. jmap
jmap(Memory Map)用来查看堆内存使用状况,一般配合jhat命令使用。
语法
jmap [option] pid
jmap [option] executable core
jmap [option] [server-id@]remote-hostname-or-ip
2
3
参数 | 作用 |
---|---|
-permstat | 打印进程的类加载器和类加载器加载的持久代对象信息 |
-heap | 查看进程堆内存使用情况:包括使用的GC算法、堆配置参数和各代中堆内存使用 |
-histo[:live] | 查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象 |
-dump:format=b,file=dumpFileName | 用jmap把进程内存使用情况dump到文件中,再用jhat分析查看 |
导出堆内存:如 jmap 1114
查看堆内存使用情况:jmap -heap pid
# 4. jhat
jhat 用来对上面 dump 出来的内容进行分析,他会在服务器上开启一个端口作为 web 访问的入口,然后将解析出来的数据已 web 的形式提供访问,这对于某些服务器来说可能不允许其开启端口提供访问。
[esv@storm-master Desktop]# jhat -port 8888 /home/esv/dump.dat
Reading from /home/esv/dump.dat...
Dump file created Sat Aug 01 04:21:12 PDT 2015
Snapshot read, resolving...
Resolving 411123 objects...
Chasing references, expect 82 dots..................................................................................
Eliminating duplicate references..................................................................................
Snapshot resolved.
Started HTTP server on port 8888
Server is ready.
2
3
4
5
6
7
8
9
10
# 5. jstat
检查 JVM 的整体运行情况,如 Eden、Survivor、老年代的内存使用情况,还有 Young GC 和 Full gC 的执行次数以及耗时。
比如命令:jstat -gc 2227
[root@ls ~]# jstat -gc 2227
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
19456.0 23552.0 12604.5 0.0 136192.0 40299.3 157184.0 76886.5 87040.0 82226.5 11008.0 10188.4 56 1.321 4 0.818 2.139
2
3
S0C | From Survivor 区的大小 |
S1C | To Survivor 区的大小 |
S0U | From Survivor 区当前使用的内存大小 |
S1U | To Survivor 区当前使用的内存大小 |
EC | Eden 区的大小 |
EU | Eden 区当前使用的内存大小 |
OC | 老年代的大小 |
OU | 老年代当前使用的内存大小 |
MC | 方法区(永久代、元数据区)的大小 |
MU | 方法区(永久代、元数据区)的当前使用的内存大小 |
YGC | 系统运行迄今为止的 Young GC 次数 |
YGCT | Young GC 的耗时 |
FGC | 系统运行迄今为止的 Full GC 次数 |
FGCT | Full GC 的耗时 |
GCT | 所有 GC 的总耗时 |
比如命令:jstat -gc PID 1000 10
,每隔1秒钟更新出来最新的一行 jstat 统计信息,一共执行10次 jstat 统计