JVM调优小工具

36

JVM调优小工具

在进行JVM调优时,一般情况下,我们都会使用JDK的bin目录下提供的虚拟机性能监控、故障处理工具。

这些工具一般分为三类:

  1. 商业授权工具

  2. 正式支持工具

  3. 实验性工具

我们一般能使用的是正式支持工具和实验性工具。

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堆和方法区的详细信息。

生成堆转储快照的几种方式:

  1. jmap命令

  2. 通过JVM参数-XX:+HeapDumpOnOutOfMemoryError ,当JVM堆发生内存溢出时,自动生成堆转储快照文件。

  3. 通过JVM参数-XX:+HeapDumpOnCtrlBreak ,可以使用 [Ctrl] + [Break] 键让虚拟机生成堆转储快照文件。

  4. Linux下通过kill -3 发出进程退出信号恐吓虚拟机,也可以拿到堆转储快照文件。

主要option:

  • -dump :生成Java堆转储快照。格式为-dump:[live,]format=b,file=<filename> ,其中 live 子参数说明是否只dump出存活的对象。

  • -heap:显示Java堆详细信息,如使用了那种回收器、参数配置、分代状况等。

  • -histo:显示堆中对象的统计信息,包括类、实例数量、合计容量。

jhat:虚拟机堆转储快照分析工具

功能:来分析jmap生成的堆转储快照。

一般不会直接使用jhat命令来分析堆转储快照文件,有两个原因:

  1. 分析工作十分耗时和耗资源,不会占用服务器资源进行分析

  2. jhat的分析功能相对来说比较简陋,有其他更专业的工具

jstack:Java堆栈跟踪工具

功能:用于生成虚拟机当前时刻的线程快照。生成线程快照的目的通常是定位线程出现长时间停顿的原因。

从JDK5起,java.lang.Thread 类新增了一个getAllStackTraces() 方法用于获取虚拟机中所有线程的StackTraceElement 对象。

命令格式:

jstack [ option ] vmid

主要option:

  • -F:当正常输出的请求不被响应时,强制输出线程堆栈

  • -l:除堆栈外,显示关于锁的附加信息

  • -m:如果调用本地方法,显示C/C++的堆栈信息