JVM 问题排查过程中的常用命令

JVM 问题排查过程中的常用命令

jps(看进程号)

jps [ options ] [ hostid ]

列出指定主机上的所有虚拟机(一个 Java 应用就是一个虚拟机,一个虚拟机就是一个进程),该命令仅限于报告它具有访问权限的 jvm 的信息。其中,hostid 可以包含可选组件,表示通信协议、端口号和其他具体实现数据。

如果 jps 命令在没有指定 hostid 的情况下运行,那么它将在本地主机上搜索已安装的 jvm。如果以 hostid 开头,则使用指定的协议和端口在指定的主机上搜索 jvm,前提是 jstatd 进程在目标主机上运行。jps 命令报告在目标系统上发现的每个 JVM 的标识符 (或 lvmid)。lvmid 通常是操作系统中 JVM 进程的进程 ID,但不一定是这样。在没有选项的情况下,jps 列出了每个 Java 应用程序的 lvmid,后面跟着应用程序类名或 jar 文件名的简短形式。类名或 JAR 文件名的缩写形式省略了类的包信息或 JAR 文件的路径信息。

jps 命令使用 Java 启动器(Java launcher)查找传递给主方法的类名和参数。如果目标 JVM 是用自定义启动器启动的,那么类或 JAR 文件名和主方法的参数都不可用。在这种情况下,jps 命令为类名或 JAR 文件名以及 main 方法的参数输出字符串 Unknown。

选项(options):以下测试结果都是在一个只运行了一个 tomcat 的服务器上得出的

剩下的看官方文档

jinfo(看配置)

jinfo [ option ] pid

jinfo [ option ] executable core

jinfo [ option ] [ servier-id ] remote-hostname-or-IP

其中:

jinfo 命令用于打印指定 Java 进程或核心文件或者远程调试服务器的 Java 配置信息。配置信息包括 Java 系统属性(Java system properties)和 Java 虚拟机 (JVM) 命令行标志(Java Virtual Machine command-line flags)。如果指定的进程运行在 64 位 JVM 上,那么您可能需要指定 -J-d64 选项,例如:jinfo -J-d64 -sysprops pid
该工具可能在 JDK 的未来版本中不可用。在没有 dbgen.dll 的 Windows 系统中,必须安装 Windows 调试工具才能让这些工具工作。PATH 环境变量应该包含目标进程所使用的 jvm.dll 的位置,或者生成崩溃转储文件的位置。例如: 设置 PATH=%JDK HOME%\jre\bin\client;%PATH%
配置项:

剩下的看官方文档

jmap(看堆内存)

jmap [ options ] pid

jmap [ options ] executable core

jmap [ options ] [ pid ] server-id@ ] remote-hostname-or-IP

其中

jmap 命令打印指定进程或者核心文件或远程调试服务器的共享对象内存映射或堆内存的详细信息。如果指定的进程运行在 64 位 Java Virtual Machine (JVM) 上,那么您可能需要指定 -J-d64 选项,例如:jmap -J-d64 -heap pid
该工具可能在 JDK 的未来版本中不可用。在没有 dbgen.dll 的 Windows 系统中,必须安装 Windows 调试工具才能让这些工具工作。PATH 环境变量应该包含目标进程所使用的 jvm.dll 的位置,或者生成崩溃转储文件的位置。例如: 设置 PATH=%JDK HOME%\jre\bin\client;%PATH%

配置项:

剩下的看官方文档 jmap.txt

jhat(分析内存文件用页面展示)

jhat [ options ] heap-dump-file

其中:

jhat 命令解析 Java 堆转储文件(Java heap dump file)并启动 web 服务器。jhat 命令允许您使用您最喜欢的 web 浏览器浏览堆转储。jhat 命令支持预先设计的查询,例如显示一个已知类 MyClass 的所有实例,以及对象查询语言 (OQL)。OQL 类似于 SQL,除了查询堆转储(heap dump )。OQL 的帮助可以从 jhat 命令显示 OQL 帮助页面获得,使用默认端口的话,OQL 帮助可在 http://localhost:7000/oqlhelp/ 中找到
有几种方法可以生成 Java 堆转储文件:

jstack(看栈帧)

jstack [ options ] pid

jstack [ options ] executable core

jstack [ options ] [ server-id@ ] remote-hostname-or-IP

其中,

jstack 命令打印指定 Java 进程、core 文件,或远程调试服务器的 Java 线程的 Java 堆栈跟踪信息。对于每个 Java 帧(frame),完整的类名、方法名、字节码索引 (BCI) 和行号 (如果可用) 将被打印出来。使用 -m 选项,jstack 命令使用程序计数器 (PC) 打印所有线程的 Java 和 native 帧(native 帧就是 native 方法即 C++ 方法的调用栈)。为每个 native 帧,最接近 PC 的 native 符号,当可用时,被打印。c++ 的名字是无法显示的(这里原文有但此错误,我猜是这个意思)。为了获取 c++ 名称,这个命令的输出可以通过管道传递到 c++filt。如果指定的进程运行在 64 位 Java 虚拟机上,则可能需要指定 -j-d64 选项,例如:jstack -J-d64 -m pid
该工具可能在 JDK 的未来版本中不可用。在没有 dbgen.dll 的 Windows 系统中,必须安装 Windows 调试工具才能让这些工具工作。PATH 环境变量应该包含目标进程所使用的 jvm.dll 的位置,或者生成崩溃转储文件的位置。例如: 设置 PATH=%JDK HOME%\jre\bin\client;%PATH%
选项:

jstat (JVM 统计数据,常用于看 GC 信息)

jstat [ generalOption | outputOptions vmid [ interval[s|ms] [ count ] ]

其中:

vmid: 虚拟机标识符,它是一个指示目标 JVM 的字符串。一般语法如下所示
[protocol:][//]lvmid[@hostname[:port]/servername]
vmid 字符串的语法对应于 URI 的语法。vmid 字符串可以是一个简单的整数 (表示本地 JVM),也可以是一个更复杂的结构 (指定通信协议、端口号和其他特定于实现的值)。参见虚拟机标识符。

jstat 命令显示一个已测试的 Java HotSpot VM 的性能统计数据。目标 JVM 由其虚拟机标识符或 vmid 选项标识。

通用选项:

jstatd(RMI 远程方法调用应用程序)

jstatd [ options ]

jstatd 命令是一个RMI 服务器应用程序,它监视被检测的 Java HotSpot 虚拟机的创建和终止,并提供一个接口,使远程监视工具能够连接到运行在本地主机上的 jvm。(这里的主机指的是被远程监控的主机)

jstatd 服务器需要在本地主机上进行 RMI 注册。jstatd 服务器尝试通过默认端口连接到 RMI 注册表上,或者使用 -p port 选项指定的端口上。如果没有找到 RMI 注册表,则在 jstatd 应用程序中创建一个,该应用程序绑定到由 -p port 选项指示的端口,或者在省略 -p port 选项时绑定到默认的 RMI 注册表端口。通过指定 -nr 选项,可以停止创建内部 RMI 注册表。

选项: