2. JVM监控及诊断工具-命令行篇
2.1 概述
性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。
Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。
体会1:使用数据说明问题,使用知识分析问题,使用工具处理问题。
体会2:无监控、不调优!
2.1.1 简单命令行工具
在我们刚接触java学习的时候,大家肯定最先了解的两个命令就是javac,java,那么除此之外,还有没有其他的命令可以供我们使用呢?
我们进入到安装jdk的bin目录,发现还有一系列辅助工具。这些辅助工具用来获取目标 JVM 不同方面、不同层次的信息,帮助开 发人员很好地解决Java应用程序的一些疑难杂症。

不同版本JDK可能会有所差异,以上为JDK 11 中的工具,JDK 8 中的工具在 JDK 11 中有的已被删除。
官方源码地址:http://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/jdk.jcmd/share/classes/sun/tools
2.2 jps 查看正在运行的Java进程
jps(Java Process Status):
显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。
说明:对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的,是唯一的。
C:\Users\Administrator>jps -h
usage: jps [--help]
jps [-q] [-mlvV] [<hostid>]
Definitions:
<hostid>: <hostname>[:<port>]
-? -h --help -help: Print this help message and exit.
2.2.1 测试
C:\Users\Administrator>jps
27600
32972 Jps
C:\Users\Administrator>jps -l
27600
28536 jdk.jcmd/sun.tools.jps.Jps
C:\Users\Administrator>jps -lv
27600 exit -XX:ErrorFile=C:\Users\Administrator\\java_error_in_webstorm64_%p.log -XX:HeapDumpPath=C:\Users\Administrator\\java_error_in_webstorm64.hprof -Xms128m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -XX:+IgnoreUnrecognizedVMOptions -ea -Dsun.io.useCanonCaches=false -Dsun.java2d.metal=true -Djbr.catch.SIGABRT=true -Djdk.http.auth.tunneling.disabledSchemes="" -Djdk.attach.allowAttachSelf=true -Djdk.module.illegalAccess.silent=true -Dkotlinx.coroutines.debug=off -XX:CICompilerCount=2 -XX:ReservedCodeCacheSize=512m -XX:CompileCommand=exclude,com/intellij/openapi/vfs/impl/FilePartNodeRoot,trieDescend -XX:SoftRefLRUPolicyMSPerMB=50 --add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED --add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED -javaagent:D:/Crack/jetbra/ja-netfilter.jar -Djb.vmOptionsFile=C:\Users\Administrator\AppData\Roaming\\JetBrains\\WebStorm2024.1\webstorm64.exe.vmoptions -Djava.system.class.loader=com.intellij.util.lang.PathClassLoader -Dide
35532 jdk.jcmd/sun.tools.jps.Jps -Denv.class.path=D:\Java\jdk-17.0.8\lib;.; -Dapplication.home=D:\Java\jdk-17.0.8 -Xms8m -Djdk.module.main=jdk.jcmd
2.2.2 基本语法
(1) options 参数
-q:仅仅显示LVMID(local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等-l:输出应用程序主类的全类名 或 如果进程执行的是jar包,则输出jar完整路径-m:输出虚拟机进程启动时传递给主类main()的参数-v:列出虚拟机进程启动时的JVM参数。比如:-Xms20m -Xmx50m是启动程序指定的jvm参数。
说明:以上参数可以综合使用。
补充:如果某 Java 进程关闭了默认开启的UsePerfData参数(即使用参数-XX:-UsePerfData),那么jps命令(以及下面介绍的jstat)将无法探知该Java 进程。
jps -l -m 等价于 jps -lm
(2) hostid 参数
RMI注册表中注册的主机名。如果想要远程监控主机上的 java 程序,需要安装 jstatd。
对于具有更严格的安全实践的网络场所而言,可能使用一个自定义的策略文件来显示对特定的可信主机或网络的访问,尽管这种技术容易受到IP地址欺诈攻击。
如果安全问题无法使用一个定制的策略文件来处理,那么最安全的操作是不运行jstatd服务器,而是在本地使用jstat和jps工具。