JVM调优小工具
JVM调优小工具
在进行JVM调优时,一般情况下,我们都会使用JDK的bin目录下提供的虚拟机性能监控、故障处理工具。
这些工具一般分为三类:
商业授权工具
正式支持工具
实验性工具
我们一般能使用的是正式支持工具和实验性工具。
jps:虚拟机进程状况工具
功能:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(LVMID)。并且支持通过RMI服务查看远程虚拟机进程状态。
说明:该工具主要用来获取LVMID,然后再使用其他工具进行后续操作。
命令格式:
jps [ option ] [ hostid ]
参数说明:
hostid:为RMI注册表中注册的主机名
主要option:
-p
:只输出LVMID,省略主类的名称-m
:输出虚拟机进程启动时传递给主类main()
函数的参数-l
:输出主类的全名,如果进程执行的是JAR包,则输出JAR路径-v
:输出虚拟机进程启动时的JVM参数
jstat:虚拟机统计信息监视工具
功能:是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或远程虚拟机进程中的类加载、内存、垃圾收集、即时编译器等运行时数据。
命令格式:
jstat [ option vmid [interval[ s | ms ] [count]] ]
参数说明:
vmid:如果是远程虚拟机,则VMID的格式如下:
[protocol:][//]lvmid[@hostname[:port]/servername]
主要option:
-class
:监视类加载、卸载数量、总空间以及类装载所耗费的时间-gc
:监视java堆状况-gcutil
:与gc类似,但输出主要关注已使用空间百分比-gccause
:与gc类似,但是会输出导致上一次gc的原因-compiler
:输出即时编译器编译过的方法、耗时等信息-printcompilation
:输出已经被即时编译器编译的方法
jinfo:Java配置信息工具
功能:可以实时查看和调整虚拟机各项参数。
命令格式:
jinfo [ option ] pid
主要option:
-sysprops
:可以把虚拟机进程的System.getProperties()
的内容打印出来-flag
:可以在运行期修改一部分运行期可写的虚拟机参数值,格式-flag [+|-]name
或者-flag name=value
jmap:Java内存映像工具
功能:可以通过命令方式生成堆转储快照。也可以查询 finalize执行队列、Java堆和方法区的详细信息。
生成堆转储快照的几种方式:
jmap命令
通过JVM参数
-XX:+HeapDumpOnOutOfMemoryError
,当JVM堆发生内存溢出时,自动生成堆转储快照文件。通过JVM参数
-XX:+HeapDumpOnCtrlBreak
,可以使用 [Ctrl] + [Break] 键让虚拟机生成堆转储快照文件。Linux下通过
kill -3
发出进程退出信号恐吓虚拟机,也可以拿到堆转储快照文件。
主要option:
-dump
:生成Java堆转储快照。格式为-dump:[live,]format=b,file=<filename>
,其中 live 子参数说明是否只dump出存活的对象。-heap
:显示Java堆详细信息,如使用了那种回收器、参数配置、分代状况等。-histo
:显示堆中对象的统计信息,包括类、实例数量、合计容量。
jhat:虚拟机堆转储快照分析工具
功能:来分析jmap生成的堆转储快照。
一般不会直接使用jhat命令来分析堆转储快照文件,有两个原因:
分析工作十分耗时和耗资源,不会占用服务器资源进行分析
jhat的分析功能相对来说比较简陋,有其他更专业的工具
jstack:Java堆栈跟踪工具
功能:用于生成虚拟机当前时刻的线程快照。生成线程快照的目的通常是定位线程出现长时间停顿的原因。
从JDK5起,java.lang.Thread
类新增了一个getAllStackTraces()
方法用于获取虚拟机中所有线程的StackTraceElement
对象。
命令格式:
jstack [ option ] vmid
主要option:
-F
:当正常输出的请求不被响应时,强制输出线程堆栈-l
:除堆栈外,显示关于锁的附加信息-m
:如果调用本地方法,显示C/C++的堆栈信息