jvm命令行工具详解

299 阅读2分钟

jps:虚拟机进程状况工具

jps(JVM Process Status Tool)是其中的典型。除了名字像UNIX的ps命令之外,它的功能也和ps命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)。

  1. jps命令格式
$ jps [ options ] [ hostid ]
  1. jps执行样例
$ jps -l
97568 org.jetbrains.jps.cmdline.Launcher
31381 org.jetbrains.jps.cmdline.Launcher
1173 jdk.jcmd/sun.tools.jps.Jps
87127 com.intellij.database.remote.RemoteJdbcServer
66603 org.jetbrains.idea.maven.server.RemoteMavenServer36
635 
12972 
  1. jps还可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,参数hostid为RMI注册表中注册的主机名,主要选项如下:
选项作用
-q只输出LVMID,省略主类的名称
-m输出虚拟机进程启动时传递给主类main()函数的参数
-l输出主类全称,如果进程执行的是jar包,则输出jar包路径
-v输出虚拟机进程启动时的jvm参数

jstat:虚拟机统计信息监视工具

jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可 以显示本地或者远程[1]虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。

  1. jstat命令格式
$ jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
# 对于命令格式中的VMIDLVMID需要特别说明一下:如果是本地虚拟机进程,VMIDLVMID 是一致的;如果是远程虚拟机进程,那VMID的格式应当是:[protocol:][//]lvmid[@hostname[:port]/servername],servername可省略
$ jstat -gc rmi://192.168.1.1:8080/servername 
  1. jstat执行样例
$ jstat -gc 2764 250 20
# 参数interval和count代表查询间隔和次数
  1. 选项option代表用户希望查询的虚拟机信息,主要分为三类:类加载、垃圾收集、运行期编译状况,主要选项如下:
选项作用
-class监视类加载、卸载数量、总空间以及类装载所耗费的时间
-gc监视java堆状况,包括Eden区、Survivor区、老年代、永久代等的容量,已用空间,垃圾收集时间合计等信息
-gccapacity监视内容与-gc基本相同,输出主要福按住Java堆各个区域使用到的最大、最小空间
-gcutil监视内容与-gc基本相同,输出主要关注已使用空间占总空间的百分比
-gccause与-gcutil功能一样,但是会额外输出导致上一次垃圾收集产生的原因
-gcnew监视新生代垃圾收集状况
-gcnewcapacity监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
-gcold监视老年代垃圾收集状况
-gcoldcapacity监视内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
-gcpermcapacity输出永久代使用到的最大、最小空间
-compiler输出即时编译器编译过的方法、耗时等信息
-printcompilation输出已经被即时编译的方法

jinfo:Java配置信息工具

jinfo(Configuration Info for Java)的作用是实时查看和调整虚拟机各项参数。使用jps命令的-v参 数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除 了去找资料外,就只能使用jinfo的-flag选项进行查询了(如果只限于JDK 6或以上版本的话,使用java- XX:+PrintFlagsFinal查看参数默认值也是一个很好的选择)。jinfo还可以使用-sysprops选项把虚拟机 进程的System.getProperties()的内容打印出来。

  1. jinfo命令格式
$ jinfo [ option ] pid
  1. jinfo执行样例
$ jinfo -flag CMSInitiatingOccupancyFraction 1444 
-XX:CMSInitiatingOccupancyFraction=85

jmap:Java内存映像工具

jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。如 果不使用jmap命令,要想获取Java堆转储快照- XX +HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出异常出现之后自动生成堆转储 快照文件,通过-XX:+HeapDumpOnCtrlBreak参数

  1. jmap命令格式
$ jmap [ option ] vmid
  1. jmap执行样例,生成dump文件
$ jmap -dump:format=b,file=filename.hprof 3500 
Dumping heap to C:\Users\filename.hprof ... Heap dump file created
  1. jmap主要选项如下:
选项作用
-dump生成Java堆转储快照,格式jmap -dump:[live,]format=b,file=,其中live参数说明是否只dump出存活的对象
-finalizerinfo现实在F-Queue中等待Finalizer线程执行finalize方法的对象
-heap现实Java堆详细信息
-histo显示堆中对象统计信息,包括类、实例数量、合计容量
-permstat以ClassLoader为统计口径显示永久代内存状态
-F当虚拟机进程对-dump选项没有响应时,可使用本选项强制生成dump快照

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

jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照

  1. jhat命令格式
$ jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
  1. jps执行样例
$ jhat filename.bin 
Reading from eclipse.bin... Dump file created Fri Nov 19 22:07:21 CST 2010 Snapshot read, resolving... Resolving 1225951 objects... Chasing references, expect 245 dots.... Eliminating duplicate references... Snapshot resolved. Started HTTP server on port 7000 Server is ready.

屏幕显示“Server is ready.”的提示后,用户在浏览器中输入http://localhost:7000/可以看到分析结 果

jstack:Java堆栈跟踪工具

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者 javacore文件)

  1. jstack命令格式
$ jstack [ option ] vmid
  1. jstack执行样例
$ jstack -l 3108   
2023-08-17 17:26:49
Full thread dump OpenJDK 64-Bit Server VM (11.0.17+8-jvmci-22.3-b08 mixed mode):

Threads class SMR info:
  1. jstack主要选项如下:
选项作用
-F当正常输出请求不响应时,强制输出线程堆栈
-l除堆栈外,显示关于锁的附加信息
-m如果调用到本地方法的话,可以显示C/C++的堆栈