目录
- JVM 调优的概念
- jps
- 1.options 功能选项
- 2.hostid
- jstat
- 1.vmid格式
- 2.interval 和 count
- 3.option
- jinfo
- jmap
- jhat
- jstack
- jvisualvm
JVM 调优的概念
调优的前提是发现问题,然后通过工具定位问题并实地分析问题,最后根据问题现象选用最合适的策略优化 / 解决 问题;JVM调优的工具很多,有jdk自带的工具,例如:jvisualvm、jconsole;也有第三方的:eclipse附带的内存分析工具MAT、专业分析gc日志的工具——GChisto等。本文主要针对如下jdk自动工具进行介绍。
jps
jps 的作用是列出系统中正在运行的虚拟机线程
命令格式:
jps [ options ] [ hostid ]
1.options 功能选项
可单个,也可多个:
- jps -l : 输出主类全名或jar路径
- 一般情况下用到最多的是 jps -l 查看应用的pid
- jps -q : 只输出LVMID
- jps -m : 输出JVM启动时传递给main()的参数
- jps -v : 输出JVM启动时显示指定的JVM参数
- jps -l -m
2.hostid
hostid 是RMI注册表中,注册的主机名(很少用到略过)。
jstat
虚拟机统计信息监视工具
jstat 命令格式
jstat [ [ option ] vmid [ interval [s | ms] ] [ count ] ]
参数说明:
1.vmid格式
如果是本地虚拟机进程,那么它与lvmid一致,如果是远程虚拟机线程格式如下:
[protocol:][//]lvmid[@hostname[:port]/servername]
2.interval 和 count
interval 和 count 代表查询间隔时间和查询次数,如果不进行指定则默认查询一次,如下指令查询虚拟机进程15196,每隔 500毫秒打印一次共计5次;
3.option
option 是监视选项
- -class class loader的行为统计
- 共计装载7478个类,总空间13498.5 Byte ; 卸载1个类,总空间... ;Time代表耗时
- -compiler 输出编译器编译过的方法、耗时....
- -gc 垃圾回收堆的行为统计
C--总容量,U--已使用的容量
S0C : survivor0区的总容量
S1C : survivor1区的总容量
S0U : survivor0区已使用的容量
S1C : survivor1区已使用的容量
EC : Eden区的总容量
EU : Eden区已使用的容量
OC : Old区的总容量
OU : Old区已使用的容量
MC : Metaspace 容量
MC : Metaspace 已用
YGC : 新生代垃圾回收次数
YGCT : 新生代垃圾回收时间
FGC : 老年代垃圾回收次数
FGCT : 老年代垃圾回收时间
GCT : 垃圾回收总消耗时间
- -gccapacity 输出各个堆区域使用到的最大、最小空间
NGCMN : 新生代占用的最小空间
NGCMX : 新生代占用的最大空间
OGCMN : 老年代占用的最小空间
OGCMX : 老年代占用的最大空间
OGC: 当前年老代的容量 (KB)
OC: 当前年老代的空间 (KB)
- -gcutil 输出内容类似jstat -gc , -gcutil 是按照百分比输出的
- S0、S1 占用为空,Eden 占用 52.18%,old--8%,Metaspace 95.25%......;young gc 5次共耗时0.027,Full GC 2次 共耗时 0.067。
- -gccause 同-gcutil,还会输出最近两次垃圾回收事件的原因
- -gcnew 新生代行为统计
TT:Tenuring threshold(提升阈值)
MTT:最大的tenuring threshold
DSS:survivor区域大小 (KB)
- -gcnewcapacity 同 -gcnew 但是它关注的是新生代各区域的边界
- -gcold 年老代和永生代行为统计
- -gcoldcapacity 同 -gcold 它关注的是边界
jinfo
jinfo可以实时查看和调整虚拟机参数,指令格式如下:
jinfo [ option ] pid
-flag : 输出指定args参数的值
-flags : 不需要args参数,输出所有JVM参数的值
-sysprops : 输出系统属性,等同于System.getProperties()
例如,查看进程 15196 的所有参数:
jinfo -flags 15196
jmap
jmap 是内存映射工具,用于生成堆转储快照,命令格式如下:
jmap [ option ] vmid
- dump : 生成堆转储快照
jmap -dump:live,format=b,file=D:\\DUMP_FILES\\dump.hprof 15196
- finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
- heap : 显示Java堆详细信息
- histo : 显示堆中对象的统计信息
- permstat : to print permanent generation statistics
- F : 当-dump没有响应时,强制生成dump快照
jhat
jhat配合jmap使用,它可以分析jmap生成的dump快照
jhat -J-Xmx512m D:\\DUMP_FILES\\dump.hprof
jstack
生成堆线程快照
-F : 当正常输出请求不被响应时,强制输出线程堆栈
-l : 除堆栈外,显示关于锁的附加信息
-m : 如果调用到本地方法的话,可以显示C/C++的堆栈
jvisualvm
jvisualvm是图形化工具