JVM提供了丰富的性能监控和故障处理的工具,在生产环境中,我们可以使用这些工具进行JVM性能调优和故障处理。
命令行工具
常用的包括:jps、jstat、jstatd、jinfo、jmap、jstack。
jps
JVM进程状态工具,可以列出系统上已启动的java应用进程状态。类似于linux系统的ps指令。输出到控制台的格式为:
lvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]
- 命令用法:
jps [ options ] [ hostid ]
- options
参数 | 作用 |
---|---|
-q | 输出类名称,JAR文件名和传递给main方法的参数的输出 |
-m | 输出传递给main方法的参数 |
-l | 输出完整软件包名称或完整路径名称 |
-v | 输出通过标志文件(.hotspotrc文件或-XX:Flags = 参数指定的文件)传递给JVM的参数 |
-V | 输出传递给main方法的参数 |
–Joption | 将选项传递给javac调用的Java启动器 |
- hostid:目标系统的字符串,如果不写,则默认目标为本机JVM。格式如下:
[protocol:][[//]hostname][:port][/servername]
jstat
JVM统计监视工具,能够收集并记录命令行选项指定的性能统计信息。
- 命令用法:
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
- 参数:
generalOption:-help, -options, -version。
vmid:虚拟机标识符,格式为[protocol:][//]lvmid[@hostname][:port][/servername] protocol
interval[s|ms]:输出间隔,默认单位为毫秒。如果指定,jstat将在每个间隔生成其输出。
count:要显示的样本数,默认为无穷大,显示统计信息,直到目标jvm终止或jstat命令终止。 - outputOptions :
参数 | 作用 |
---|---|
-statOption | jstat显示的统计信息 |
-h n | 每n个样本(输出行)显示一个列标题,在第一行数据上方显示列标题 |
-t n | 将时间戳列显示为输出的第一列。时间戳是自目标jvm的开始时间起的时间 |
-JjavaOption | 将选项传递给javac调用的Java启动器 |
-statOption可以参考:statOption参数详情。
jstatd
jstatd可以启动一个JVM JSTAT的守护进程,监视JVM的 创建和终止,并提供一个接口,允许远程监控工具附加到本地系统上运行的JVM上。
- 命令用法:
jstatd [ options ]
- options :
参数 | 作用 |
---|---|
-nr | 当找不到现有的rmi注册表时,不会在jstatd进程中创建内部rmi注册表 |
-p port | 需要找到RMI注册表的端口号,如果找不到,则在未指定-nr的情况下创建 |
-n rminame | 远程rmi对象在rmi注册表中绑定到的名称 |
-Joption | 将选项传递给javac调用的Java启动器 |
jinfo
为给定的Java进程或核心文件或远程调试服务器打印Java配置信息。配置信息包括Java系统属性和Java虚拟机命令行标志。
- 命令用法:
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP
这些选项参数是互斥的,选项紧跟在命令名之后。
- 参数
pid:要为其打印配置信息的进程ID,jps命令输出的id。
executable:能够产生堆内存的Java可执行文件。
core:要为其打印配置信息的核心文件。
remote-hostname-or-IP:远程调试服务器的主机名或IP地址。
server-id:如果多个调试服务器在同一远程主机上运行,则为可选的唯一ID。 - option:
参数 | 作用 |
---|---|
no option | key-value形式打印命令行标志以及系统属性 |
-flags | key-value形式打印命令行标志 |
-sysprops | key-value形式打印系统属性 |
-h或-help | 打印帮助信息 |
jmap
打印共享对象内存映射或给定进程或核心文件或远程调试服务器的堆内存细节,与jinfo使用相似。
- 命令用法:
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP
这些选项参数是互斥的,选项紧跟在命令名之后。
- 参数与jinfo一致。
- option:
参数 | 作用 |
---|---|
no option | 打印共享对象映射。对于加载到目标vm中的每个共享对象,将打印开始地址、映射大小和共享对象文件的完整路径 |
-heap | 打印堆摘要,打印使用的GC算法、堆配置和按生成的堆使用情况 |
-histo | 打印堆的直方图。对于每个Java类,都会打印对象数、内存大小(字节)和完全限定的类名。vm内部类名以“*”前缀打印。 |
-permstat | 打印类加载程序的Java堆永久生成的统计数据。对于每个类加载器,都会打印其名称、活动性、地址、父类加载器以及已加载的类的数量和大小 |
-h或-help | 打印帮助信息 |
jstack
为给定的Java进程或核心文件或远程调试服务器打印Java线程的Java堆栈跟踪。对于每个Java框架,打印完整的类名、方法名称、“BCI”(字节代码索引)和行号(如果可用的话)。
- 命令用法:
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP
- 参数与jinfo一致。
- option:
参数 | 作用 |
---|---|
-m | 打印混合模式(Java和本地C/C++框架)堆栈跟踪 |
图形界面工具
常用的包括:jconsole、jvisualvm。
jconsole
启动程序为jdk安装目录bin下的jconsole.exe,打开后选择要监控的进程即可展示出如下窗口:
jvisualvm
启动程序为jdk安装目录bin下的jvisualvm.exe,打开后选择要监控的进程即可展示出如下窗口:
本文参考:
https://docs.oracle.com/javase/1.5.0/docs/tooldocs/#manage