引言

在jdk的开发包里,除了我们常用的java.exejavac.exe程序外,还有一系列辅助工具,这些工具可以帮助我们更好地分析指定java程序的运行状态,比如jstack.exejps.exejstate.exe等。下面我们对一些重要的工具进行讲解。

注意:在jdk8及以前,工具类的可执行文件的实现都在lib/tools.jar上,但是在jdk9及以后,以前存储在lib中的lib/rt.jarlib/tools.jarlib.dt.jar,以及其他各种内部jar文件现在以更高效的格式存储在lib目录中特定的实现文件中。

注意:我使用的环境为Windows10,jdk11。此处放出jdk11工具程序的官方说明文档,读者可以从此文档中获取详细信息。

进程查看器——jps

jps命令会列出运行在本地的所有java进程。

它的相关参数如下:

  • -q:指定jps只输出进程ID,而不输出类的名称。
  • -m:输出传递给java进程的参数。
  • -l:输出主函数的完整路径。
  • -v:显示传递给java虚拟机的参数。

示例如下:

C:\Users\hu'nan>jps -m -l -v
19536 cn.bigkai.ApplicationStart -Xlog:gc=trace:file=gc.log -Xmx32M -Xms32M -javaagent:F:\instrument\java\idea2019\lib\idea_rt.jar=57122:F:\instrument\java\idea2019\bin -Dfile.encoding=UTF-8

查看虚拟机运行状态——jstat

jstat可以查看java虚拟机的运行时的相关信息 以及堆信息的详细情况。基本语法如下:

C:\Users\hu'nan>jstat --help
Usage: jstat --help|-optionsjstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

jstat的相关参数如下:

  • option的相关参数如下:

    • -class:显示ClassLoader的相关信息。
    • -compiler:显示JIT编译的相关信息。
    • -gc:显示与GC相关的堆栈信息。
    • -gccause:显示垃圾回收相关信息,同时显示最后一次或当前正在发生的垃圾回收的原因
    • -gcnew:显示新生代信息。
    • -gcnewcapacity:显示新生代大小与使用情况。
    • -gcold:显示老年代信息。
    • -gcoldcapacity:显示老年代大小与使用情况。
    • -gcpermacapacity:显示永久代大小。
    • -gcutil:显示垃圾回收信息。
    • -printcompilation:输出JIT编译的方法信息。
  • -t参数可以在输出信息前加一个Timestamp列,显示程序的运行时间。
  • -h参数可以指定在周期性数据输出时,输出多少行数据后输出一个表头信息。
  • interval:指定输出统计数据的周期,单位为毫秒。
  • count:指定一个输出多少次数据。

示例如下:

C:\Users\hu'nan>jstat -gcnew -t -h 2 19536 1000 6
Timestamp        S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT2704.3    0.0 2048.0    0.0 2048.0 15  15 1024.0  12288.0   4096.0      1    0.0042705.3    0.0 2048.0    0.0 2048.0 15  15 1024.0  12288.0   4096.0      1    0.004
Timestamp        S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT2706.3    0.0 2048.0    0.0 2048.0 15  15 1024.0  12288.0   4096.0      1    0.0042707.3    0.0 2048.0    0.0 2048.0 15  15 1024.0  12288.0   4096.0      1    0.004
Timestamp        S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT2708.3    0.0 2048.0    0.0 2048.0 15  15 1024.0  12288.0   4096.0      1    0.0042709.3    0.0 2048.0    0.0 2048.0 15  15 1024.0  12288.0   4096.0      1    0.004

不同option参数的输出信息不同,具体的可以自行百度了解。

操作虚拟机参数——jinfo

前面我们讲了jps,了解到它的-v参数会显示传递给虚拟机的参数,这次介绍的jinfo命令更加强大,它不仅能查看虚拟机参数,而且可以在运行时修改部分参数。它的基本语法为:

C:\Users\hu'nan>jinfo --help
Usage:jinfo <option> <pid>(to connect to a running process)

jinfo相关参数如下:

  • option的相关参数如下:

    • -flag<name>:打印java虚拟机指定参数的值。
    • -flag[+-]<name>:设置指定Java虚拟机参数的布尔值。
    • -flag<name>=<name>:设置指定java虚拟机参数的值。

注意:不是所有的参数都支持使用jinfo查看,也不是所有的参数都支持动态修改。可以通过命令行或者代码获取支持动态修改的JVM参数:

  • 通过命令行获取:

    Linux环境下:java -XX:+PrintFlagsInitial | grep manageable

    Window环境下:

  • 通过API获取:HotSpotDiagnosticMXBean.getDiagnosticOptions()方法返回虚拟机支持动态修改的参数。

    public class DiagnosticOptionsTest {public static void main(String[] args) {HotSpotDiagnostic mxBean = new HotSpotDiagnostic();List<VMOption> diagnosticVMOptions = mxBean.getDiagnosticOptions();for (VMOption vmOption:diagnosticVMOptions){System.out.println(vmOption.getName() + " = " + vmOption.getValue());}}
    }
    

示例如下:

C:\Users\hu'nan>java -XX:+PrintFlagsInitial | findstr manageableintx CMSAbortablePrecleanWaitMillis           = 100                                    {manageable} {default}intx CMSTriggerInterval                       = -1                                     {manageable} {default}intx CMSWaitDuration                          = 2000                                   {manageable} {default}bool HeapDumpAfterFullGC                      = false                                  {manageable} {default}bool HeapDumpBeforeFullGC                     = false                                  {manageable} {default}bool HeapDumpOnOutOfMemoryError               = false                                  {manageable} {default}ccstr HeapDumpPath                             =                                        {manageable} {default}uintx MaxHeapFreeRatio                         = 70                                     {manageable} {default}uintx MinHeapFreeRatio                         = 40                                     {manageable} {default}bool PrintClassHistogram                      = false                                  {manageable} {default}bool PrintConcurrentLocks                     = false                                  {manageable} {default}C:\Users\hu'nan>jinfo -flag HeapDumpOnOutOfMemoryError 4580
-XX:-HeapDumpOnOutOfMemoryErrorC:\Users\hu'nan>jinfo -flag +HeapDumpOnOutOfMemoryError 4580C:\Users\hu'nan>jinfo -flag HeapDumpOnOutOfMemoryError 4580
-XX:+HeapDumpOnOutOfMemoryError

导出堆到文件——jmap

jmap是一个功能强大的堆内存查看工具,它可以生成java程序的堆Dump文件,也可以查看堆内对象实例的统计信息、ClassLoader信息以及finalizer队列。jmap的基本语法为:

C:\>jmap <option> <pid>

option参数:

  • -dump:[live,]format=b,file=<filename>:使用hprof二进制形式,输出jvm的heap内容到文件(live参数是可选的,当指定了live参数时,那么只输出存活对象到文件)

  • -finalizerinfo:打印正等候回收的对象的信息。

  • -histo[:live]:打印每个class的实例数、内存占用、全限定类名。 VM的内部类名字开头会加上前缀”*”,如果加上live参数,那么只统计存活对象数量。

  • -clstats:打印Java堆的类装载器的统计信息。

示例如下:

C:\Users\hu'nan>jmap -histo 4580num     #instances         #bytes  class name (module)
-------------------------------------------------------1:          8421         958408  [B (java.base@11.0.2)2:           643         398560  [I (java.base@11.0.2)3:          1987         313384  [Ljava.lang.Object; (java.base@11.0.2)

注意:在jdk8及以前,可以使用jhat命令分析,在jdk8之后,官方推荐使用VisualVM代替。

查看线程堆栈——jstack

jstack命令可以用于查看应用程序的堆栈。常用语法为:

C:\Users\hu'nan>jstack [-l] <pid>

-l是可选参数,指定它将会打印锁的附加信息。jstack命令会在控制台打印输出程序中所有的锁信息。

示例如下:

C:\Users\hu'nan>jstack -l 4580
2020-06-03 20:49:40
Full thread dump Java HotSpot(TM) 64-Bit Server VM (11.0.2+9-LTS mixed mode):Threads class SMR info:
_java_thread_list=0x00000287b76019a0, length=12, elements={0x00000287b662d800, 0x00000287b6637800, 0x00000287b6f0b000, 0x00000287b6f0c000,
0x00000287b6f0e800, 0x00000287b6f11800, 0x00000287b6647000, 0x00000287b70b3000,
0x00000287b72d0000, 0x00000287b72d4000, 0x00000287b77ba000, 0x0000028797b4d800
}

远程主机信息收集——jstatd

jstatd命令是一个RMI服务器端程序,可以通过它来建立本地计算机与远程服务器之间的通信。

jstatd参数如下:

  • -nr:当没有找到现有的RMI注册中心时,指定这个选项不会在jstatd进程中创建内部RMI注册中心。
  • -p <port>:设置RMI注册中心的端口号,默认为1099。
  • -n <rminame>:设置远程RMI对象在RMI注册表中绑定到的名称。默认名称是JStatRemoteHost。
  • -Joption/-J:此选项将Java选项传递给JVM,其中该选项是Java应用程序启动程序的参考页面中描述的选项之一。例如,-J-Xms48m将启动内存设置为48mb。

示例如下:

首先要创建一个jstatd.all.policy文件,在jdk8及以前需要写入:

grant codebase "file:F:/instrument/siki--java/java-11.0.2/lib/tools.jar" {permission java.security.AllPermission;
};

因为jdk11里没有tools.jar,所以需要新的配置方法:

grant codebase "jrt:/jdk.jstatd" {    permission java.security.AllPermission;
};grant codebase "jrt:/jdk.internal.jvmstat" {    permission java.security.AllPermission;
};

然后在命令行运行:

C:\Users\hu'nan>jstatd -J-Djava.security.policy=F:\instrument\siki--java\java-11.0.2\conf\jstatd.all.policy
jstatd started (bound to /JStatRemoteHost)

使用jps显示远程计算机的java程序:

C:\Users\big'kai>jps 192.168.1.103:1099
4580 ApplicationStart
10056 Jps
3912
18780 Launcher

多功能指令工具——jcmd

jdk7以后新增了一个jcmd指令,它具有很多功能:导出堆、查看java进程、导出线程信息、执行GC、查看虚拟机状态等。jcmd命令可以对指定的java 虚拟机执行命令。jcmd -l会列出当前系统运行的java虚拟机。

C:\Users\hu'nan>jcmd -l
4580 cn.bigkai.ApplicationStart
18360 jdk.jcmd/sun.tools.jcmd.JCmd -l

然后可以通过jcmd <pid> help的方式列出它们所支持的指令:

C:\Users\hu'nan>jcmd 4580 help
4580:
The following commands are available:
Compiler.CodeHeap_Ana(这个词是屏蔽词。。。)lytics
Compiler.codecache
Compiler.codelist
Compiler.directives_add
Compiler.directives_clear
Compiler.directives_print
Compiler.directives_remove
Compiler.queue
GC.class_histogram
GC.class_stats # 查看系统中类的统计信息
GC.finalizer_info
GC.heap_dump # 导出堆信息
GC.heap_info
GC.run
GC.run_finalization
JFR.check
JFR.configure
JFR.dump
JFR.start
JFR.stop
JVMTI.agent_load
JVMTI.data_dump
ManagementAgent.start
ManagementAgent.start_local
ManagementAgent.status
ManagementAgent.stop
Thread.print # 打印线程堆栈信息
VM.check_commercial_features
VM.class_hierarchy
VM.classloader_stats
VM.classloaders
VM.command_line
VM.dynlibs
VM.flags # 获取启动参数
VM.info
VM.log
VM.metaspace
VM.native_memory
VM.print_touched_methods
VM.set_flag # 设置启动弄参数
VM.stringtable
VM.symboltable
VM.system_properties # 获取系统的properties信息
VM.systemdictionary
VM.unlock_commercial_features
VM.uptime # 查看虚拟机启动时间
VM.version
helpFor more information about a specific command use 'help <command>'.

还可以通过jcmd 4580 PerfCounter.print 获取所有性能统计相关信息

jdk常用的七种性能监控命令行工具相关推荐

  1. 六个 Linux性能监控命令行工具

    六个 Linux性能监控命令行工具  1.htop - http://htop.sourceforge.net/ 一个可以让用户与之交互的进程查看器.作为文本模式的应用程序,主要用于控制台或 X 终端 ...

  2. linux rm替代命令_5种基本Linux命令行工具的现代替代品

    linux rm替代命令 在Linux / Unix系统的日常使用中,我们使用许多命令行工具来完成工作并理解和管理我们的系统,例如du用来监视磁盘利用率, top用来显示系统资源. 其中一些工具已经存 ...

  3. 10个Linux 系统性能监控命令行工具

    引言: 系统一旦跑起来,我们就希望它能够稳定运行,不要宕机,不出现速度变慢.因此,对于Linux 系统管理员来说每天监控和调试 Linux 系统的性能问题是一项繁重却又重要的工作.监控和保持系统启动并 ...

  4. 常用jdk的命令行工具:_jhsdb:JDK 9的新工具

    常用jdk的命令行工具: 我喜欢在分析性能和基于Java的应用程序的其他问题的早期步骤中使用JDK随附的命令行工具,并在诸如jcmd , jps , jstat , jinfo , jhat和jmap ...

  5. deb 安装_本地安装DEB包的3种命令行工具(适合Ubuntu和Deepin )

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. 前言 在本教程中,我们将学习如何使用三种不同的命令行工具(d ...

  6. linux下的安装命令行工具下载,本地安装DEB包的3种命令行工具(适合Debian体系)

    1. 前言 在本教程中,我们将学习如何使用三种不同的命令行工具(dpkg.apt和gdebi)在Debian及其衍生产品(如Ubuntu和Linux Mint)中安装本地软件包(. deb). 这对那 ...

  7. 实用!五款新型 Linux 命令行工具

    使用新的替代工具来改进旧的命令行工具. 作者 | Ricardo Gerardi 译者 | 弯月,责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 以下为译文: 在Linux/Unix系统 ...

  8. 利用Windows的命令行工具tasklist和findstr,start结合计划任务

    Windows虽然是以UI来见长的.但是,真正的POWERFUL工具,还是命令行的. 今天,介绍一种利用Windows命令行工具 tasklist 和 findstr, start 来实现监控某个进程 ...

  9. 深入理解Java虚拟机-如何利用 JDK 自带的命令行工具监控上百万的高并发的虚拟机性能...

    虚拟机系列文章 深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析 深入理解 Java 虚拟机(第二弹) - 常用 vm 参数分析 深入理解 Java 虚拟机-如何利用 Visual ...

  10. JVM-10虚拟机性能监控与故障处理工具之【JDK的命令行】

    文章目录 思维导图 概述 命令行工具 jps 虚拟机进程状况工具 概述 语法及使用 jstat 虚拟机统计信息监视工具 概述 语法及使用 jinfo Java配置信息工具 概述 语法及使用 jmap ...

最新文章

  1. 在Openstack上部署compute节点上时,开启服务openstack-nova-compute.service无法启动的解决方法
  2. CIO的网络安全“三大纪律”
  3. 战胜心理寂寞的六大秘方
  4. 寻仙新马源码一键端_强大,腾讯开源前后端接口开发工具!
  5. Angular依赖注入的一个例子和注入原理单步调试
  6. 投资股权众筹项目,至少需要关注6个方面
  7. 编程输出2的90次方的精确值
  8. 软件包管理 之 RPM 基础 《RPM 的介绍和应用》
  9. 查看linux系统端口占用情况
  10. 认识CodeSmith
  11. 计算机审计实训遇到的问题及解决方法,计算机审计实训总结报告.doc
  12. 基于容器的虚拟化资源调度系统的架构设计
  13. C语言手机通讯录系统
  14. Alarm机制-学习记录
  15. 小学6年级下册计算机课教案,小学六年级下册音乐教案大全
  16. [分享]豪杰超级DVD播放器Ⅲ破解之菜鸟了解PE文件
  17. linux 正点原子ov5640_【正点原子FPGA连载】第二十三章OV5640摄像头LCD显示-摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南 (amobbs.com 阿莫电子论坛)...
  18. 【Life系列】之我在底层的生活
  19. 母象《易经》原文的象数:
  20. 百分号编码和汉字的转换

热门文章

  1. 多重共线性分析 与 方差膨胀因子VIF
  2. 单例模式只会懒汉饿汉?读完本篇让你面试疯狂加分
  3. 湖南大学计算机考研复习资料
  4. 新闻资讯APP——Resultpage.vue组件
  5. java怎么判断文件大小_java判断文件大小
  6. 蓝牙协议分析(6)_BLE地址类型
  7. 推荐一款团队协作软件---confluence
  8. 怎么下载b站的弹幕(danmuku)
  9. 计算机应用能力考试ppt,全国专业技术人员计算机应用能力考试 PPT 2003 题库版...
  10. PS图片中字体或图像的颜色替换