《深入理解Java虚拟机》(四) 调优工具、指令
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是图形化工具