几个JDK工具

jps

列出所有正在运行的JVM

功能

jps命令列出目标系统上已检测的Java HotSpot VM, 该命令仅限于报告具有访问权限的JVM的信息

如果在未指定hostid的情况下运行jps命令, 则它将在本地主机上搜索已检测的JVM; 如果以hostid启动,则它使用指定的协议和端口在指定的主机上搜索JVM

jps命令报告在目标系统上找到的每个已检测JVM的本地JVM标识符或lvmid. lvmid通常(但不一定)是JVM进程的操作系统进程标识符. 如果没有选项, jps会列出每个Java应用程序的lvmid, 后跟应用程序的类名或jar文件名的简短形式. 类名或JAR文件名的缩写形式省略了类的包信息或JAR文件路径信息

jps命令使用Java启动程序查找传递给main方法的类名和参数. 如果使用自定义启动程序启动目标JVM, 则类或JAR文件名和main方法的参数不可用. 在这种情况下, jps命令输出类名称或JAR文件名的字符串Unknown以及main方法的参数

jps命令生成的JVM列表可以由授予运行该命令的主体的权限限制. 该命令仅列出原则具有访问权限的JVM, 具体取决于操作系统特定的访问控制机制

options

-q 只显示pid

-m 显示传递给 main() 的参数

-l 显示应用程序主类的完整包名或应用程序的JAR文件的完整路径名

-v 显示传递给JVM的参数

jinfo

查看/修改JVM参数信息

功能

jinfo命令打印指定Java进程或核心文件或远程调试服务器的Java配置信息, 包括Java系统属性和JVM命令行标志

如果指定的进程在64位JVM上运行, 可能需要指定-J-d64选项: jinfo-J-d64 -sysprops pid

该指令JDK以后可能不再支持

options

no-option 显示命令行和系统属性键值对

-flag name 显示指定命令行键值对

-flag [+|-]name 启用或禁用指定命令行属性

-flag name=value 设置指定命令行属性值

-flags 显示传递给JVM的命令行属性

-sysprops 显示系统属性键值对

jstat

监控JVM运行状态

功能

显示JVM性能统计信息, 目标JVM由vmid指定

options

-options 查看可用选项

-class 类装载器统计

-compiler jit编译器统计

-gc 垃圾收集堆信息

-gccapacity 内存池生成和空间容量

-gccause -gcutil的内容+最后一次gc的原因

-gcnew 新生代统计

-gcnewcapacity 新生代空间大小统计

-gcold 年老代和元空间行为统计

-gcoldcapacity 年老代空间大小统计

-gcmetacapacity 元空间大小统计

-gcutil 垃圾回收统计概要

-printcompilation JVM编译器方法统计

jmap

打印JVM堆内存信息

功能

打印JVM堆内存信息, 如果指定的进程在64位JVM上运行, 可能需要指定-J-d64选项: jmap-J-d64 -heap pid

该指令JDK以后可能不再支持

options

no option 显示共享对象映射

-dump: format=b, file=filename 将Java堆另存为hprof二进制格式, 可以使用jhat命令读取生成的文件

-heap 打印使用的垃圾收集, 头部配置和生成方式堆使用的堆摘要

-histo 打印堆的直方图, 对于每个Java类, 将打印对象数, 内存大小(以字节为单位)和完全限定的类名

-clstats 打印class loader统计信息

jstack

打印java线程堆栈

功能

jstack命令打印指定Java进程, 核心文件或远程调试服务器的Java线程的Java堆栈跟踪

对于每个Java帧, 将打印完整的类名, 方法名, 字节代码索引(BCI)和行号(如果可用)

如果指定的进程在64位JVM上运行, 可能需要指定-J-d64选项: jstack -J-d64 -m pid

options

-l 长列表, 打印锁的额外信息

-m 打印java和native c/c++框架的所有栈信息

排查实战

频繁GC问题或内存溢出问题

  1. 使用jps查看线程ID
  2. 使用jstat -gc 25252 250 20查看gc情况, 一般比较关注PERM区的情况, 查看GC的增长情况
  3. 使用jstat -gccause输出上次GC原因
  4. 使用jmap -dump:format=b,file=heapDump 25252生成堆转储文件
  5. 使用jhat或者可视化工具(Eclipse Memory Analyzer, IBM HeapAnalyzer)分析堆情况
  6. 结合代码解决内存溢出或泄露问题

死锁

  1. 使用jps查看线程ID
  2. 使用jstack 3331查看线程情况

参考 Java开发必须掌握的线上问题排查命令-HollisChuang’s Blog