jdk 自带工具

在 java 安装目录 bin 下。

你可以看到对应的信息,这里有很多 java 为我们提供的工具。

$   ls
appletviewer.exe*  java-rmi.exe*        javap.exe*         jdb.exe*    jmap.exe*        jstack.exe*     klist.exe*         policytool.exe*   servertool.exe*
extcheck.exe*      java.exe*            javapackager.exe*  jdeps.exe*  jmc.exe*         jstat.exe*      ktab.exe*          rmic.exe*         tnameserv.exe*
idlj.exe*          javac.exe*           javaw.exe*         jhat.exe*   jmc.ini          jstatd.exe*     msvcr100.dll*      rmid.exe*         unpack200.exe*
jabswitch.exe*     javadoc.exe*         javaws.exe*        jinfo.exe*  jps.exe*         jvisualvm.exe*  native2ascii.exe*  rmiregistry.exe*  wsgen.exe*
jar.exe*           javafxpackager.exe*  jcmd.exe*          jjs.exe*    jrunscript.exe*  keytool.exe*    orbd.exe*          schemagen.exe*    wsimport.exe*
jarsigner.exe*     javah.exe*           jconsole.exe*      jli.dll*    jsadebugd.exe*   kinit.exe*      pack200.exe*       serialver.exe*    xjc.exe*

jdk 命令行工具概览

命令 说明
jps 虚拟机进程状况工具
jstat 虚拟机统计信息监视工具
jinfo java 配置信息工具
jmap java 内存映射工具
jhat 虚拟机堆转储按照分析工具
jstack java 堆栈跟踪工具
hsdis jit 生成代码反汇编
jconsole java 监视与管理控制台
jvisualvm 多合一故障处理工具

jps

jps 命令列出目标系统上的已检测Java HotSpot VM。

该命令仅限于报告具有访问权限的JVM的信息。

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

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,具体取决于操作系统特定的访问控制机制。

参数

命令行的参数

$   jps -help
usage: jps [-help]
       jps [-q] [-mlvV] [<hostid>]

Definitions:
    <hostid>:      <hostname>[:<port>]

具体每个参数的含义,直接查询下官方文档即可。

参数 含义
-q 禁止传递给main方法的类名,JAR文件名和参数的输出,仅生成本地JVM标识符的列表。
-m 显示传递给main方法的参数。 嵌入式JVM的输出可能为null。
-l 显示应用程序主类的完整包名或应用程序的JAR文件的完整路径名。
-v 显示传递给JVM的参数。
-V 禁止传递给main方法的类名,JAR文件名和参数的输出,仅生成本地JVM标识符的列表。

实例

上面的参数不用去记忆,知道作用。

使用的时候查询即可。

jps -l
10768 sun.tools.jps.Jps
19488
4620 org.jetbrains.jps.cmdline.Launcher

jstat

jstat 命令可以查看堆内存各部分的使用量,以及加载类的数量。

jhat

jhat

命令解析Java堆转储文件并启动Web服务器。使用jhat命令可以使用您喜欢的Web浏览器浏览堆转储。

jhat命令支持预先设计的查询,例如显示已知类MyClass的所有实例和对象查询语言(OQL)。除查询堆转储外,OQL与SQL类似。可以从jhat命令显示的OQL帮助页面获得有关OQL的帮助。

使用默认端口,可以在 http://localhost:7000/oqlhelp/ 获得OQL帮助

有几种方法可以生成Java堆转储:

  • 使用 jmap -dump 选项在运行时获取堆转储。

  • 使用jconsole选项在运行时通过HotSpotDiagnosticMXBean获取堆转储。

  • 通过指定 -XX:+HeapDumpOnOutOfMemoryError Java虚拟机(JVM)选项引发OutOfMemoryError时会生成堆转储。

  • 使用hprof命令。请参阅HPROF: Heap/CPU 分析工具

http://docs.oracle.com/javase/8/docs/technotes/samples/hprof.html

jinfo

jinfo 命令打印指定Java进程的Java配置信息。

配置信息包括Java系统属性和JVM命令行标志。

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

jinfo -J-d64 -sysprops pid

此命令不受支持,可能在将来的JDK版本中不可用。

在不存在dbgeng.dll的Windows系统中,必须安装Windows调试工具才能使这些工具正常工作。

PATH环境变量应包含目标进程使用的jvm.dll的位置或生成核心转储文件的位置。

jmap

jmap 命令打印指定的运行进程的详细信息。

此命令不受支持,可能在将来的JDK版本中不可用。

在不存在dbgeng.dll文件的Windows系统上,必须安装Windows调试工具才能使这些工具正常工作。

PATH环境变量应包含目标进程使用的jvm.dll文件的位置或生成核心转储文件的位置。

参数

jmap命令的选项

-clstats pid

连接到正在运行的进程并打印Java堆的类加载器统计信息。

-finalizerinfo pid

连接到正在运行的进程并打印有关正在等待完成的对象的信息。

-histo [:live] pid

连接到正在运行的进程并打印Java对象堆的直方图。 如果指定了live子选项,则它仅计算活动对象。

-dump:dump options pid

连接到正在运行的进程并转储Java堆。

转储选项包括:

live - 指定时,仅转储活动对象; 如果未指定,则转储堆中的所有对象。

format=b - 转储Java堆。 以hprof二进制格式

file=filename - 将堆转储到filename

案例

jmap -dump:live,format=b,file=heap.bin pid

jstack

jstack

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

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

使用-m选项,jstack命令使用程序计数器(PC)打印所有线程的Java和本机帧。对于每个本机帧,打印最接近PC的本机符号(如果可用)。

C++错位的名称不是demangled。要解码C++名称,可以将此命令的输出通过管道传递给c++ filt。

当指定的进程在64位Java虚拟机上运行时,您可能需要指定-J-d64选项,

例如:jstack -J-d64 -m pid。

注意:此实用程序不受支持,可能在将来的JDK版本中不可用。

在不存在dbgeng.dll文件的Windows系统中,必须安装Windows调试工具才能使用这些工具。

PATH环境变量需要包含目标进程使用的jvm.dll的位置,或者生成故障转储文件的位置。

拓展阅读

jstack 使用案例

jconsole

jconsole 命令启动图形控制台工具,使您可以监视和管理本地或远程计算机上的Java应用程序和虚拟机。

在Windows上,jconsole命令不与控制台窗口关联。 但是,当jconsole命令失败时,它会显示一个包含错误信息的对话框。

jvisualvm

Java VisualVM 是一个直观的图形用户界面,可在指定的Java虚拟机(JVM)上运行时提供有关基于Java技术的应用程序(Java应用程序)的详细信息。

Java VisualVM这个名称源于Java VisualVM可视化地提供有关JVM软件的信息。

Java VisualVM将多个监视,故障排除和分析实用程序组合到一个工具中。例如,独立工具jmap,jinfo,jstat和jstack提供的大多数功能都集成到Java VisualVM中。其他功能(例如jconsole命令提供的功能)可以添加为可选插件。

Java VisualVM对Java应用程序开发人员有用,可以对应用程序进行故障排除,并监视和改进应用程序的性能。

Java VisualVM使开发人员能够生成和分析堆转储,跟踪内存泄漏,执行和监视垃圾收集,以及执行轻量级内存和CPU分析。

您可以使用插件扩展Java VisualVM功能。例如,jconsole命令的大多数功能都可以通过MBeans选项卡和JConsole插件包装器插件获得。

您可以通过选择Tools,然后选择Java VisualVM菜单中的Plugins,从标准Ja​​va VisualVM插件目录中进行选择

参考资料

《深入理解 jvm》

  • jstat

https://blog.csdn.net/tzs_1041218129/article/details/61630981

  • jhat

java命令–jhat命令使用

  • jstack

http://www.herongyang.com/Java-Tools/jstack-JVM-Thread-Dump-Stack-Strace.html

  • jvisualvm

jvisualvm 工具使用

使用 VisualVM 进行性能分析及调优