NicolasFränkel最近在博客文章“ 行业工具OpenJDK 11 ”中发布了与OpenJDK 11一起提供的命令行工具的调查。 在那篇文章中,他简要总结了工具jps (一个JVM进程状态工具 ), jinfo (一个JVM配置详细信息 ), jmap ( 堆上的类/对象 ), jstack ( 线程分析 )和图形工具JConsole ( 监视Java应用程序 )。 。
所有这些工具都很方便Java开发人员了解如何根据需要进行应用,Fränkel的帖子为这些工具的新手提供了很好的介绍性概述。 近年来,正如我在“ jcmd:一个 ” 一文中所讨论的,我已经转向使用单个jcmd工具代替大多数其他命令行工具(尽管它并不能以任何方式代替图形工具JConsole)。 JDK命令行工具可以全部统治 。”
关于与jcmd
相关的/ r / java subreddit线程 ,与各个工具进行了简短的讨论。 我可以看到两种方法的优点(使用jcmd
或使用多个单独的工具)。 我对比了我对它们相对优势和劣势的看法。
jcmd 与其余 | |
---|---|
jcmd | 其他工具 |
单一互动工具 | 具有不同名称和选项的不同工具 |
由于具有交互性,因此运行功能需要更多的击键/命令 | 对于熟悉命令和选项的人员以及给定的JVM进程支持使用正在使用的命令/选项的情况,所需的击键次数更少 |
jcmd <pid> help 提供了该JVM进程支持的特定功能以进行jcmd 分析 | 针对JVM进程运行单个工具的结果是检测该工具对该进程的支持(或缺乏)的主要方法 |
仅支持某些个别工具的最常用功能子集 | 每个工具的性质决定了支持功能的标准 |
更新,在线资源更少 | 较旧,具有更多在线资源 |
不视为“实验性” | 几个单独的工具( jps , jinfo , jmap , jstack 等)被标记为“实验性”,并且可能会更改/删除(“ 工具参考”指出“ 实验工具不受支持,应在理解的情况下使用。它们可能不会在将来的JDK版本中可用。其中一些工具当前在Windows平台上不可用。”) |
可以通过DiagnosticCommandMBean以 编程方式使用提供的重要jcmd 详细信息 | 个别工具很少有直接对应的编程访问权限 |
是使用jcmd还是使用单独的工具之一,很大程度上取决于个人的喜好和偏好。 那些已经使用过现有单个工具的人可能会喜欢那些工具中的更直接的方法,而那些不熟悉单个工具的人可能会喜欢jcmd
提供的交互功能来确定哪些工具和选项可用。 我当然更喜欢非实验性工具,而不是“实验性”工具,但是对于许多版本的JDK,这些工具中的许多都被标记为“实验性”,并且仍然存在。
前面提到的博客文章“ jcmd:一个全部统治他们的JDK命令行工具 ”描述了如何使用jcmd
的交互功能来标识其支持各种JVM进程的功能。 在该帖子的末尾有一张表格,将jcmd
选项“映射”到一些相应的单个工具的命令和选项。 为了方便起见,我在这里复制。
功能性 | jcmd | 类似工具 |
---|---|---|
列出Java进程 | jcmd | jps -lm |
堆转储 | jcmd <pid> GC.heap_dump | jmap -dump <pid> |
堆使用直方图 | jcmd <pid> GC.class_histogram | jmap -histo <pid> |
线程转储 | jcmd <pid> Thread.print | jstack <pid> |
列出系统属性 | jcmd <pid> VM.system_properties | jinfo -sysprops <pid> |
列出VM标志 | jcmd <pid> VM.flags | jinfo -flags <pid> |
jcmd
工具继续得到增强。 JDK 9通过JEP 228 (“添加更多诊断命令”)对jcmd
进行了一些增强。 在JDK 11中,对显示类加载器层次结构的支持已添加到jcmd
。 这是对类加载器层次结构的支持的简单屏幕快照。
正如Fränkel在其文章中所总结的那样: “ JDK提供了许多现成的工具来帮助开发人员”,并且“它们在开发人员的日常工作中是一笔巨大的财富。” 无论选择使用单个JDK提供的工具还是选择使用jcmd
这种观点都适用。
翻译自: https://www.javacodegeeks.com/2019/02/jcmd-circa-jdk-11.html