Java虚拟机工具总结

记录来自《深入理解Java虚拟机》第三版,周志明。

一、总结归纳

1.1、基础工具

基础工具:用于支持基本的程序创建和运行。

名称主要作用
appletviewer在不适用 Web 浏览器的情况下运行和调试 Applet,JDK 11 中被移除
extcheck检查 JAR 冲突的工具,从 JDK 9 被移除
jar创建和管理 JAR 文件
javajava 运行工具,用于运行 Class 文件或 JAR 文件
javac用于 Java 编程语言的编译器
javadocJava 的 API 文档生成器
javahC 语言头文件和 Stub 函数生成器,用于编写 JNI 方法
javapJava 字节码分析工具
jlink将 Module 和它依赖打包成一个运行时镜像文件
jdb基于 JPDA 协议的调试器,以类似于 GDB 的方式进行调试 Java 代码
jdepsJava 类依赖性分析器
jdeprscan用于搜索 JAR 包中使用了 “ deprecated ” 的类,从 JDK 9 开始提供

1.2、安全工具

安全:用于程序签名、设置安全测试等。

名称主要作用
keytool管理密钥库和证书。主要用于获取或缓存 Kerberos 协议的票据授权票据。允许用户查看本地凭据缓存和密钥表中的条目(用于 Kerberos 协议)
jarsigner生成并验证 JAR 签名
policytool管理策略文件的 GUI 工具,用于管理用户策略文件(.java.policy),在 JDK 10 中被移除

1.3、国际化工具

国际化:用于创建本地语言文件。

名称主要作用
native2ascii本地编译到 ASCII 编码的转换器(Native-to-ASCII Converter),用于 “ 任意受支持的字符编码 ” 和之对应的 “ ASCII 编码和 Unicode 转义 ” 之间的相互转换

1.4、远程方法调用工具

远程方法调用:用于跨 Web 或网络的服务交互。

名称主要作用
rmicJava RMI 编译器,为使用 JRMP 或 IIOP 协议的远程对象生成 Stub 、Skeleton 和 Tie 类,也用生成 OMG IDL
rmiregistry远程对象注册表服务,用于在当前主机的指定端口上创建并启动一个远程对象注册表
rmid启动激动系统守护进程,允许在虚拟机中注册或激动对象
serialver生成并返回指定类的序列化版本 ID

1.5、Java IDL 与 RMI-IIOP

Java IDL 与 RMI-IIOP :在 JDK 11 中结束了十余年的 CORBA 支持,这些工具不在提供。官方说明 http://openjdk.java.net/jeps/320

名称主要作用
tnameserv提供对命名服务的访问
idljIDL 转 Java 编译器(IDL-to-Java Compiler),生成映射 OMG IDL 接口的 Java 源文件,并启用以 Java 编程语言编写的使用 CORBA 功能的应用程序的 Java 源文件。IDL 意即接口定义语言(Interface Definition Language)
orbd对象请求代理守护进程(Object Request Broker Daemon),提供以客户端查找和调用 CORBA 环境服务端上的持久化对象的功能。使用 ORBD 代替瞬态命名服务 tnameserv。ORBD 包括瞬态命名服务和持久命名服务。ORBD 工具集成了服务器管理器、互操作命名服务和引导名称服务器的功能。当客户端想进行服务器的定位、注册和激活功能时,可以与 servertool一起使用
servertool为应用程序注册、注销、启动和关闭服务器提供易用的接口

1.6、部署工具

部署工具:用于程序打包、发布和部署。

名称主要作用
javapackager打包、签名 Java 和 JavaFX 应用程序,在 JDK 11 中被移除
pack200使用Java GZIP 压缩器将 JAR 文件转换为压缩的 Pack200 文件。压缩的压缩文件是高度压缩的 JAR,可以直接部署,节省带宽并减少下载时间
unpack200将 Pack200 生成的打包文件解压提取为 JAR 文件

1.7、Java Web Start

名称主要作用
javaws启动 Java Web Start 并设置各种选项的工具。在 JDK 11 中被移除

1.8、性能监控和故障处理工具

性能监控和故障处理:用于监控分析 Java 虚拟机运行信息,排查问题。

名称主要作用
jpsJVM Process Status Tool,显示指定系统内所有的 HotSpot 虚拟机进程
jstatJVM Statistics Monitoring Tool,用于收集 HotSpot 虚拟机各方面的运行数据
jstatdJVM Statistics Monitoring Tool Daemon,jstat 的守护程序,启动一个 RMI 服务器应用程序,用于监视测试的 HotSpot 虚拟机的创建和终止,并提供一个界面,允许远程监控工具附加到在本地系统上运行的虚拟机。在 JDK 9 中集成到了 JHSDB 中
jinfoConfiguration Info for Java,显示虚拟机配置信息。在 JDK 9 中集成到了 JHSDB 中
jmapMemory Map for Java,生成虚拟机的内存转储快照(heapdump 文件)。在 JDK 9 中集成到了JHSDB 中
jhatJVM Heap Analysis Tool,用于分析堆转储快照,它会建立一个 HTTP/Web 服务器,让用户可以在浏览器上查看分析结果。在 JDK 9 中被 JHSDB 代替
jstackStack Trace for Java,显示虚拟机的线程快照。在 JDK 9 中集成到了 JHSDB 中
jhsdbJava HotSpot Debugger,一个基于 Serviceability Agent 的 HotSpot 进程调试器,从 JDK 9 开始提供
jsadebugdJava Serviceability Agent Debug Daemon,适用于 Java 的可维护性代理调试守护程序,主要用于附加到指定的 Java 进程、核心文件,或充当一个调试服务器
jcmdJVM Command,虚拟机诊断命令工具,将诊断命令请求发送到正在经行的 Java 虚拟机。从 JDK 7 开始提供
jconsoleJava Console,用于监控 Java 虚拟机的使用 JMX 规范的图形工具。它可以监控本地和远程 Java 虚拟机,还可以监控和管理应用程序
jmcJava Misson Control,包含用于监控和管理 Java 应用程序的工具,而不会引入与这些工具相关联的性能开销。开发者可以使用 jmc 命令来创建 JMC 工具,从 JDK 7 Update 40 开始集成到 OracleJDK 中
jvisualvmJava VisualVM,一种图形化工具,可在 Java 虚拟机中运行时提供有关基于 Java 技术的应用程序(Java 应用程序)的详细信息。Java VisualVM 提供内存和 CPU 分析、堆转储分析、内存泄漏检测、MBean 访问和垃圾收集。从 JDK 6 Update 7 开始提供;从 JDK 9 开始不再打包入 JDK中,但仍保持更新发展,可以独立下载

1.9、WebService 工具

WebService 工具:与 CORBA 一起在 JDK 11 中移除。

名称主要作用
schemagen用于 XML 绑定的 Schema 生成器,用于生成 XML Schema 文件
wsgenXML Web Service 2.0 的 Java API,生成用于 JAX-WS Web Service 的 JAW-WS 便携式产物
wsimportXML Web Service 2.0 的 Java API,主要用于根据服务端发布的 WSDL 文件生成客户端
xjc主要用于根据 XML Schema 文件生成对应的 Java 类

1.10、REPL 和脚本工具

名称主要作用
jshell基于 Java 的 Shell REPL(Read-Eval-Print Loop)交互工具
jjs对 Nashorn 引擎的调用入口。Nashorn 是基于 Java 实现的一个轻量级高性能 JavaScript 运行环境
jrunscriptJava 命令行脚本外壳工具(Command Line Script Shell),主要用于解释执行 JavaScript、Groovy、Ruby 等脚本语言

二、命令行工具详解

2.1、jps:虚拟机进程状况工具

和 ps 命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)。

jps 命令格式:
jps [ options]  [ hostid ]
jps 执行样例:
C:\Users\jack>jps -l
38560 sun.tools.jps.Jps
35672 org.jetbrains.jps.cmdline.Launcher
18140
jps 主要选项:
选 项作 用
-q只输出 LVMID ,省略主类的名称
-m输出虚拟机进程启动时传递给主类 main() 函数的参数
-l输出主类的全名,如果进程执行的是 JAR 包,则输出 JAR 路径
-v输出虚拟机进程启动时的 JVM 参数

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

jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据,在没有 GUI 图形界面、只提供了纯文本控制台环境的服务器上,它将是运行器定位虚拟机性能问题的常用工具。

jstat 命令格式:
 jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
jstat 执行样例:
C:\Users\jack>jstat -gcutil 35672
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00   0.00  50.00  39.71  97.22  90.43      3    0.009     2    0.026    0.035
jstat 主要选项:
选 项作 用
-class监视类加载、卸载数量、总空间以及类装载所耗费的时间
-gc监视 Java 堆状况,包括 Eden 区、2 个 Survivor 区、老年代、永久代等的容量,已用空间,垃圾收集时间合计等信息
-gccapacity监视内容与 -gc 基本相同,但输出主要关注 Java 堆各个区域使用到的最大、最小空间
-gcutil监视内容与 -gc 基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause与 -gcutil 功能一样,但是会额外输出导致上一次垃圾收集产生的原因
-gcnew监视新生代垃圾收集情况
-gcnewcapacity监视内容与 -gcnew 基本相同,输出主要关注使用到的最大、最小空间
-gcold监视老年代垃圾收集情况
-gcoldcapacity监视内容与 -gcold 基本相同,输出主要关注使用到的最大、最小空间
-gcpermcapacity输出永久代使用到的最大、最小空间(JDK8 之后,使用 -gcmetacapacity )
-compiler输出即时编译器编译过的方法、耗时等信息
-printcompilation输出已经被即时编译的方法

可以使用 jstat -options 输出查看

C:\Users\jack>jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation

2.3、jinfo:Java 配置信息工具

jinfo(Configuration Info for Java)的作用是实时查看和挑战虚拟机各项参数。

jinfo 命令格式:
jinfo [option] <pid>
    (to connect to running process)
jinfo [option] <executable <core>
    (to connect to a core file)
jinfo [option] [server_id@]<remote server IP or hostname>
    (to connect to remote debug server)
jinfo 执行样列:
C:\Users\jack>jinfo -flag CMSInitiatingOccupancyFraction  35672
-XX:CMSInitiatingOccupancyFraction=-1
jinfo 主要选项:
-flag <name>         to print the value of the named VM flag
-flag [+|-]<name>    to enable or disable the named VM flag
-flag <name>=<value> to set the named VM flag to the given value
-flags               to print VM flags
-sysprops            to print Java system properties
<no option>          to print both of the above
-h | -help           to print this help message

2.4、jmap:Java内存映射工具

jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为 heapdump 或者 dump 文件)。

jmap 命令格式:
jmap [option] <pid>
    (to connect to running process)
jmap [option] <executable <core>
    (to connect to a core file)
jmap [option] [server_id@]<remote server IP or hostname>
    (to connect to remote debug server)
jmap 执行样例:
C:\Users\jack>jmap -dump:format=b,file=test123 35672
Dumping heap to C:\Users\jack\test123 ...
Heap dump file created
jmap 主要选项:
选 项作 用
-dump生成 Java 堆转储快照。格式为 -dump:[live,] format=b,file=<finename>,其中 live 子参数说明是否只 dump 出存活的对象
-finalizerinfo显示在 F-Queue 中等待 Finalizer 线程执行 finalize 方法的对象。只在 Linux/Solaris 平台有效
-heap显示 Java 堆详细信息,如使用那种回收器、参数配置、分代情况等。只在 Linux/Solaris 平台有效
-histo显示堆中对象统计信息、包括类、实例数量、合计容量
-clstats显示 ClassLoader 统计信息。只在 Linux/Solaris 平台有效
-F当虚拟机进程对 -dump 选项没有响应时,可使用这个选项强制生成 dump 快照。只在 Linux/Solaris 平台有效
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -clstats             to print class loader statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -J<flag>             to pass <flag> directly to the runtime system

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

JDK 提供 jhat(JVM Heap Analysis Tool)命令与 jamp 搭配使用,来分析 jmap 生成的堆转储快照。 jhat 内置了一个微型的 HTTP/Web 服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。(比较粗糙,一般不用)

jhat 命令格式:
jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
jhat 执行样例:
C:\Users\jack>jhat C:\Users\jack\test123
Reading from C:\Users\jack\test123...
Dump file created Fri Jul 31 04:28:06 GMT+08:00 2020
Snapshot read, resolving...
Resolving 248159 objects...
Chasing references, expect 49 dots.................................................
Eliminating duplicate references.................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

浏览器输入http://localhost:7000/ 可以得到如下:
在这里插入图片描述

jhat 主要选项:
 -J<flag>          Pass <flag> directly to the runtime system. For
                   example, -J-mx512m to use a maximum heap size of 512MB
 -stack false:     Turn off tracking object allocation call stack.
 -refs false:      Turn off tracking of references to objects
 -port <port>:     Set the port for the HTTP server.  Defaults to 7000
 -exclude <file>:  Specify a file that lists data members that should
                   be excluded from the reachableFrom query.
 -baseline <file>: Specify a baseline object dump.  Objects in
                   both heap dumps with the same ID and same class will
                   be marked as not being "new".
 -debug <int>:     Set debug level.
                     0:  No debug output
                     1:  Debug hprof file parsing
                     2:  Debug hprof file parsing, no server
 -version          Report version number
 -h|-help          Print this help and exit
 <file>            The file to read

2.6、jstack:Java 堆栈跟踪工具

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为 threaddump 或者 javacore 文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过 jstack 来查看各个线程的调用堆栈,就可以获知没有响应的线程到底在后台做些什么事情,或者等待着什么资源。

jstack 命令格式:
jstack [-l] <pid>
    (to connect to running process)
jstack -F [-m] [-l] <pid>
    (to connect to a hung process)
jstack [-m] [-l] <executable> <core>
    (to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
    (to connect to a remote debug server)
jstack 执行样例:
C:\Users\jack>jstack -l 35672
2020-07-31 05:07:05
Full thread dump Java HotSpot(TM) 64-Bit Server VM (11.0.8+10-LTS mixed mode):

Threads class SMR info:
_java_thread_list=0x00000273f9b1b750, length=13, elements={
0x00000273f92f6800, 0x00000273f9301800, 0x00000273f936e000, 0x00000273f9370000,
0x00000273f9371000, 0x00000273f937d800, 0x00000273f9389000, 0x00000273f94eb000,
0x00000273f94f4000, 0x00000273f95a7800, 0x00000273dcf26800, 0x00000273fa9dd000,
0x00000273f9734800
}

"Reference Handler" #2 daemon prio=10 os_prio=2 cpu=0.00ms elapsed=66512.59s tid=0x00000273f92f6800 nid=0xb50 waiting on condition  [0x0000009b605fe000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.8/Native Method)
        at java.lang.ref.Reference.processPendingReferences(java.base@11.0.8/Reference.java:241)
        at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.8/Reference.java:213)
   Locked ownable synchronizers:
        - None   

......
jstack 主要选项:
选 项作 用
-F当正常输出的请求不被响应时,强制输出线程堆栈
-l除堆栈外,显示关于锁的附加信息
-m如果调用到本地方法的话,可以显示 C/C++ 的堆栈
-F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m  to print both java and native frames (mixed mode)
-l  long listing. Prints additional information about locks
-h or -help to print this help message

三、可视化故障工具详解

3.1、JHSDB:基于服务性代理的调试工具

JHSDB 是一款基于服务性代理(Serviceability Agent,SA)实现的进程外调试工具。服务性代理是 HotSpot 虚拟机中一组用于映射 Java 虚拟机运行信息的、主要基于 Java 语言(含少量 JNI 代码)实现的 API 集合。JDK 9 开始提供。

Relationship of jhsdb to jcmd and to Other Command-Line JDK Tools

引用自 https://dzone.com/articles/jhsdb-a-new-tool-for-jdk-9

在这里插入图片描述

官方说明

https://docs.oracle.com/javase/9/tools/jhsdb.htm#JSWOR-GUID-0345CAEB-71CE-4D71-97FE-AA53A4AB028E

实际 UI

在这里插入图片描述

3.2、JConsole:Java 监视与管理控制台

JConsole(Java Monitoring and Management Console)是一款基于 JMX (Java Management Extension)的可视化监视、管理工具。它的主要功能是通过 JMX 的 MBean(Managed Bean)对系统经行信息收集和参数动态调整。JMX 是一种开放性的技术,不仅可以用在虚拟机本身的管理上,还可以运行与虚拟机之上的软件中,典型的如中间件大多也基于 JMX 来实现管理和监控。

官方说明

https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html

实际 UI

在这里插入图片描述

3.3、VisualVM:多合-故障处理工具

VisualVM (All-in-One Java Troubleshooting Tool)是功能最强大的运行监视和故障处理程序之一,曾经在很长的一段时间内是 Oracle 官方主力发展的虚拟机故障处理工具。

VisualVM 基于 NetBeans 平台开发工具,所以一开始它就具备了通过插件扩展功能的能力,有了插件扩展支持,VisualVM 可以做到:

  • 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)。
  • 监视应用程序的处理器、垃圾收集、堆、方法区以及线程的信息(jstat、jstack)。
  • dump 以及分析堆转储快照(jmap、jhat)。
  • 方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法。
  • 离线程序快照:收集程序的运行时配置、线程 dump、内存 dump 等信息建立一个快照,可以将快照发送开发者处进行 Bug 反馈。
  • 其他插件带来的无限可能。
官方说明

http://visualvm.github.io/index.html

不错的教程
https://www.ibm.com/developerworks/cn/java/j-lo-visualvm/index.html

补充 BTrace说明
https://blog.csdn.net/liuxiao723846/article/details/80171461

实际 UI

在这里插入图片描述

3.4、Java Mission Control:可持续在线的监控工具

Java Mission Control enables you to monitor and manage Java applications without introducing the performance overhead normally associated with these types of tools. It uses data collected for normal adaptive dynamic optimization of the Java Virtual Machine (JVM). Besides minimizing the performance overhead, this approach eliminates the problem of the observer effect, which occurs when monitoring tools alter the execution characteristics of the system.

  • AMC(Java Advanced Management Console)控制台
  • JUT(Java Usage Tracker)跟踪系统
  • JFR(Java Flight Recorder)飞行记录仪
  • JMC(Java Mission Control)

完整的,来自官方的
Oracle Java SE Subscription

在生产环境都需要商业授权,但是根据 Oracle Binary Code 协议,在个人开发环境中,允许免费使用 JMC 和 JFR。

MBean 服务器:与 JConsole 和 VisualVM 内容相同。

飞行记录器:一般包含以下信息。

  • 一般信息:关于虚拟机、操作系统和记录的一般信息。
  • 内存:关于内存管理和垃圾收集的信息。
  • 代码:关于方法、异常错误、编译和类加载的信息。
  • 线程:关于应用程序中线程和锁的信息。
  • I/O:关于文件和套接字输入、输出的信息。
  • 系统:关于正在运行 Java 虚拟机的系统、进程和环境变量的信息。
  • 事件:关于记录中的事件类型的信息,可以根据线程和堆栈追踪,按照日志或图形的格式查看。
官方说明

Oracle
https://www.oracle.com/java/technologies/jdk-mission-control.html
OpenJDK
https://wiki.openjdk.java.net/display/jmc/Main

实际 UI

在这里插入图片描述
在这里插入图片描述

四、HotSpot 虚拟机插件及工具

官方文档

https://wiki.openjdk.java.net/display/HotSpot/HotSpot+Tools

  • Ideal Graph Visualizer:用于可视化展示 C2 即时编译器是如何将字节码转化为理想图,然后转化为机器码的。
  • Client Compiler Visualizer:用于查看 C1 即时编译器生成高级中间表示(HIR),转换为低级中间表示(LIR)和做物理寄存器分配的过程。
  • MakeDeps:帮助处理 HotSpot 的编译依赖的工具。
  • Project Creator:帮助生成 Visual Studio 的 .project 文件的工具。
  • LogCompilation:将 -XX:+LogCompilation 输出的日志整理成更容易阅读的格式的工具。
  • HSDIS:即时编译器的反汇编插件。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值