jps:虚拟机进程状况工具
jps(JVM Process Status Tool)是其中的典型。除了名字像UNIX的ps命令之外,它的功能也和ps命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)。
- jps命令格式
$ jps [ options ] [ hostid ]
- 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
- jps还可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,参数hostid为RMI注册表中注册的主机名,主要选项如下:
| 选项 | 作用 |
|---|---|
| -q | 只输出LVMID,省略主类的名称 |
| -m | 输出虚拟机进程启动时传递给主类main()函数的参数 |
| -l | 输出主类全称,如果进程执行的是jar包,则输出jar包路径 |
| -v | 输出虚拟机进程启动时的jvm参数 |
jstat:虚拟机统计信息监视工具
jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可 以显示本地或者远程[1]虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。
- jstat命令格式
$ jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
# 对于命令格式中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与LVMID 是一致的;如果是远程虚拟机进程,那VMID的格式应当是:[protocol:][//]lvmid[@hostname[:port]/servername],servername可省略
$ jstat -gc rmi://192.168.1.1:8080/servername
- jstat执行样例
$ jstat -gc 2764 250 20
# 参数interval和count代表查询间隔和次数
- 选项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()的内容打印出来。
- jinfo命令格式
$ jinfo [ option ] pid
- jinfo执行样例
$ jinfo -flag CMSInitiatingOccupancyFraction 1444
-XX:CMSInitiatingOccupancyFraction=85
jmap:Java内存映像工具
jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。如 果不使用jmap命令,要想获取Java堆转储快照- XX +HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出异常出现之后自动生成堆转储 快照文件,通过-XX:+HeapDumpOnCtrlBreak参数
- jmap命令格式
$ jmap [ option ] vmid
- jmap执行样例,生成dump文件
$ jmap -dump:format=b,file=filename.hprof 3500
Dumping heap to C:\Users\filename.hprof ... Heap dump file created
- 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生成的堆转储快照
- jhat命令格式
$ jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
- 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文件)
- jstack命令格式
$ jstack [ option ] vmid
- 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:
- jstack主要选项如下:
| 选项 | 作用 |
|---|---|
| -F | 当正常输出请求不响应时,强制输出线程堆栈 |
| -l | 除堆栈外,显示关于锁的附加信息 |
| -m | 如果调用到本地方法的话,可以显示C/C++的堆栈 |