文章目录

  • 思维导图
  • 概述
  • 命令行工具
    • jps 虚拟机进程状况工具
      • 概述
      • 语法及使用
    • jstat 虚拟机统计信息监视工具
      • 概述
      • 语法及使用
    • jinfo Java配置信息工具
      • 概述
      • 语法及使用
    • jmap Java 内存映射工具
      • 概述
      • 语法及使用
    • jhat 虚拟机堆转储快照分析工具
      • 概述
      • 语法及使用
    • jstack Java堆栈跟踪工具
      • 概述
      • 语法及使用
    • hsdis:jit生成代码反汇编

思维导图


概述

前面介绍了虚拟机的内存分配和回收,大致有了一些理论基础,接下来我们从实践的角度去了解虚拟机内存管理。定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。

这里我们说的数据主要包括

  • 运行日志

  • 异常堆栈

  • GC日志

  • 线程快照(thread dump / javacore文件)

  • 堆转储快照(heapdump/hprof文件)等


命令行工具

Java安装目录 bin目录下有很多官方提供的命令行程序,今天我们俩了解下虚拟机性能监控与故障处理工具

名称 英文全称 作用
jps JVM Process Status Tool 显示指定系统内所有的HotSPot虚拟机进程
jstat JVM Statistics Monitoring Tool 用于手机HotSpot虚拟机个方面的运行数据
jinfo Configuration Info for Java 显示虚拟机配置信息
jmap Memory Map for Java 生成虚拟机的内存转储快照(headump文件)
jhat Java Heap Analysis Tool 虚拟机堆转储快照分析工具
jstack Stack Trace For Java java堆栈跟踪工具,,显示线程快照

jps 虚拟机进程状况工具

概述

Java Virtual Machine Process Status Tool

不仅名字像unix主机的ps命令,功能也相似,可以列举出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier ,LVMID)。.

使用频率最高的JDK命令行工具,以为内其他的JDK工具大多需要输入它查询到LVMID来确定要监控的是哪一个虚拟机进程。 对于本地虚拟机进程来讲,LVMID和操作系统的进程ID(Process Identifer ,PID) 一致。


语法及使用

usage: jps [-help]jps [-q] [-mlvV] [<hostid>]Definitions:<hostid>:      <hostname>[:<port>]

jps可以通过RMI协议查看开启了RMI服务的远程虚拟机进程状态。,hostid为RMI注册表中注册的主机名。

jps的其他常用选项

选项 作用
-q 只输出LVMID,省略主类的名称
-m 输出虚拟机进程启动时传递给主类main函数的参数
-l 输出主类的全名,如果执行的是jar包,输出jar路径
-v 输出虚拟机进程启动时jvm参数

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

概述

jstat (JVM Statistics Monitoring Tool)用于监视虚拟机各种运行状态信息的命令行工具。 它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾会搜、JIT编译等运行数据。

在没有图形化界面的服务器上,它将是运行期定位虚拟机性能问题的首选工具


语法及使用

Usage: jstat -help|-optionsjstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]Definitions:<option>      An option reported by the -options option<vmid>        Virtual Machine Identifier. A vmid takes the following form:<lvmid>[@<hostname>[:<port>]]Where <lvmid> is the local vm identifier for the targetJava virtual machine, typically a process id; <hostname> isthe name of the host running the target Java virtual machine;and <port> is the port number for the rmiregistry on thetarget host. See the jvmstat documentation for a more completedescription of the Virtual Machine Identifier.<lines>       Number of samples between header lines.<interval>    Sampling interval. The following forms are allowed:<n>["ms"|"s"]Where <n> is an integer and the suffix specifies the units asmilliseconds("ms") or seconds("s"). The default units are "ms".<count>       Number of samples to take before terminating.-J<flag>      Pass <flag> directly to the runtime system.
  • 对于命令格式中的VMID和LVMID,如果是本地虚拟机进程,两者一致。如果是远程虚拟机进程,则VMID的格式为
    [protocol:][//]lvmind[@hostname[:port]/servername]

  • interval : 查询间隔

  • count:查询次数 如果省略interval和count,则只查询一次

假设需要250毫秒查询一次进程3245的垃圾收集状况,一共查询20次

jstat -gc 3245 250 20
  • 选项option代表用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行期编译状况。

jstat的主要选项

选项 作用
-class 监视类装载、卸载数量,总空间以及类装载锁耗费的时间
-gc 监视Java堆状况,包括eden区、两个Survivor区、老年代、永久代等的容量、已使用空间、GC时间合计等信息
-gccapacity 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用的最大、最小空间
-gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
-gcnew 监视新生代GC状况
-gcnewcapacity 监视内容与-gcnew 基本相同,但输出主要关注Java堆各个区域使用的最大、最小空间
-gcold 监视老年代代GC状况
-gcoldcapacity 监视内容与-gcold 基本相同,但输出主要关注Java堆各个区域使用的最大、最小空间
-gcpermcapacity 输出永久代使用的最大、最小空间
-compiler 输出JIT编译器编译过的方法、耗时等信息
-printcompilation 输出已经被JIT编译的方法

使用举例

E:\Program Files\Java\jdk1.8.0_161\bin>jstat -gcutil 12888  1000  10
Warning: Unresolved Symbol: sun.gc.metaspace.capacity substituted NaN
Warning: Unresolved Symbol: sun.gc.metaspace.used substituted NaN
Warning: Unresolved Symbol: sun.gc.metaspace.capacity substituted NaN
Warning: Unresolved Symbol: sun.gc.compressedclassspace.capacity substituted NaN
Warning: Unresolved Symbol: sun.gc.compressedclassspace.used substituted NaN
Warning: Unresolved Symbol: sun.gc.compressedclassspace.capacity substituted NaNS0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT0.00  91.47  46.39   9.12      -      -      9    0.215     0    0.000    0.2150.00  91.47  48.39   9.12      -      -      9    0.215     0    0.000    0.2150.00  91.47  48.39   9.12      -      -      9    0.215     0    0.000    0.2150.00  91.47  48.39   9.12      -      -      9    0.215     0    0.000    0.2150.00  91.47  48.39   9.12      -      -      9    0.215     0    0.000    0.2150.00  91.47  48.39   9.12      -      -      9    0.215     0    0.000    0.2150.00  91.47  48.39   9.12      -      -      9    0.215     0    0.000    0.2150.00  91.47  48.39   9.12      -      -      9    0.215     0    0.000    0.2150.00  91.47  48.39   9.12      -      -      9    0.215     0    0.000    0.2150.00  91.47  48.39   9.12      -      -      9    0.215     0    0.000    0.215
  • S0: Survivor0是空的

  • S1:Survivor1使用了91.47的空间

  • E:Eden 使用了 48.39%的空间

  • O: 老年代使用了 9.12%的空间

  • M: 因为我这里是使用了JDK8 ,没有了永久代的概念,这里是元数据区

  • YGC: Minor GC表示程序启动以来,发生了9次Minor GC

  • YGCT:Young GC Time 耗时为0.215秒

  • FGC:Full GC 表示程序启动以来,发生了0次Minor GC

  • FGCT:Full GC Time 耗时为0秒

  • GCT:表示GC Time ,所有的GC总耗时 0.215秒

纯文本状态下监视虚拟机的变化确实不如后面提到的VisualVM等可视化的建施工局直接用图形的方式展现直观,但直接在主机上使用jstat命令仍然是一种常用的监控方式。


jinfo Java配置信息工具

概述


语法及使用

Usage: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)where <option> is one of:-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

使用举例

E:\Program Files\Java\jdk1.8.0_161\bin>jinfo -flag MaxPermSize 12888
-XX:MaxPermSize=85983232

jmap Java 内存映射工具

概述


语法及使用

Usage: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)where <option> is one of:<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 formatdump-options:live         dump only live objects; if not specified,all objects in the heap are dumped.format=b     binary formatfile=<file>  dump heap to <file>Example: jmap -dump:live,format=b,file=heap.bin <pid>-F                   force. Use with -dump:<dump-options> <pid> or -histoto force a heap dump or histogram when <pid> does notrespond. The "live" suboption is not supportedin this mode.-h | -help           to print this help message-J<flag>             to pass <flag> directly to the runtime system

jmap的主要选项

选项 作用
-dump 生成java堆转储快照。 格式为 -dump:[live,] format=b,file=<filename> 其中live子参数说明是否只dump出存活的对象
-finalizeinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。 只在linux/solaris平台有效
-heap 只显示Java堆详细信息。如使用脑胀回收器、参数配置、分代状况等。只在linux/solaris平台有效
-histo 显示堆中对象统计信息,包括类、实例数量、合计容量
-permstat 以ClassLoader为统计口径显示永久代内存状态。 只在linux/solaris平台有效
-F 当虚拟机进程对-dump选项没有响应时,可以使用这个选项强制生成dump快照。只在linux/solaris平台有效

使用举例, 对pid=12888的进程输出dump信息

E:\Program Files\Java\jdk1.8.0_161\bin>jmap -dump:format=b,file=test.bin 12888
Dumping heap to E:\Program Files\Java\jdk1.8.0_161\bin\test.bin ...
Heap dump file created

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

概述


语法及使用

Usage:  jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>-J<flag>          Pass <flag> directly to the runtime system. Forexample, -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 shouldbe excluded from the reachableFrom query.-baseline <file>: Specify a baseline object dump.  Objects inboth heap dumps with the same ID and same class willbe marked as not being "new".-debug <int>:     Set debug level.0:  No debug output1:  Debug hprof file parsing2:  Debug hprof file parsing, no server-version          Report version number-h|-help          Print this help and exit<file>            The file to readFor a dump file that contains multiple heap dumps,
you may specify which dump in the file
by appending "#<number>" to the file name, i.e. "foo.hprof#3".All boolean options default to "true"

用法举例

E:\Program Files\Java\jdk1.8.0_161\bin>jmap -dump:format=b,file=test.bin 12888
Dumping heap to E:\Program Files\Java\jdk1.8.0_161\bin\test.bin ...
File existsE:\Program Files\Java\jdk1.8.0_161\bin>jhat test.bin
Reading from test.bin...
Dump file created Mon Aug 06 20:49:25 CST 2018
Snapshot read, resolving...
Resolving 244224 objects...
Chasing references, expect 48 dots................................................
Eliminating duplicate references................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

浏览器输入 http://localhost:7000/


jstack Java堆栈跟踪工具

概述


语法及使用

Usage: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)Options:-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

jstack的主要选项

选项 作用
-F 当正常输出的请求不被响应时,强制输出线程堆栈
-m 如果调用到本地方法的话,可以显示C/C++的堆栈
-l 除了堆栈信息,显示关于锁的附件信息

用法举例

E:\Program Files\Java\jdk1.8.0_161\bin>jstack -l 12888
2018-08-06 21:01:10
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode):"DestroyJavaVM" prio=6 tid=0x000000000e1ab800 nid=0x2f80 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None"DefaultQuartzScheduler_QuartzSchedulerThread" prio=6 tid=0x000000000e1a9800 nid=0xb5c in Object.wait() [0x000000000f59f000]java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(Native Method)at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:410)- locked <0x0000000762395018> (a java.lang.Object)Locked ownable synchronizers:- None
......
.......
..........

hsdis:jit生成代码反汇编

Sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件。了解即可。


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

  1. jvm(4)-虚拟机性能监控与故障处理工具

    [0]README 0.1)本文文字描述转自 "深入理解jvm",旨在了解 虚拟机性能监控与故障处理工具的基础知识(仅仅在于了解): [1]概述 1)给一个系统定位问题的时候,知识 ...

  2. JVM-11虚拟机性能监控与故障处理工具之【JDK的可视化工具-JConsole】

    文章目录 思维导图 概述 JConsole: Java监视与管理平台 启动jconsole 内存监控示例 VM ARGS 代码 JConsole监控展示及说明 扩展问题 没有指定-Xmn,如何确定新生 ...

  3. JYM虚拟机性能监控与故障处理工具

    虚拟机性能监控与故障处理工具 一.jps:虚拟机进程状况工具 常用指令 二.jstat:虚拟机统计信息监视工具 常用指令 三.jinfo:配置信息工具 四.jmap:Java内存映像工具 常用指令 五 ...

  4. 虚拟机性能监控与故障处理工具

    虚拟机性能监控与故障处理工具 概述 给一个系统定位问题时,知识.经验是关键基础,数据是依据,工具是运用知识处理数据的手段.这里的数据包括:运行日志.异常堆栈.GC日志.线程快照.堆转储快照等.使用适当 ...

  5. 《深入理解JVM.2nd》笔记(四):虚拟机性能监控与故障处理工具

    文章目录 概述 JDK的命令行工具 jps:虚拟机进程状况工具 jstat:虚拟机统计信息监视工具 jinfo:Java配置信息工具 jmap:Java内存映像工具 jhat:虚拟机堆转储快照分析工具 ...

  6. 深入理解JAVA虚拟机 虚拟机性能监控和故障处理工具

    jre的bin目录下的工具,都非常小.它都是tools.jar下面的代码的一层封装而已.tools.jar不是java标准,是Hotspot实现的. 名称 作用 jps JVM Process Sta ...

  7. 虚拟机性能监控、故障处理工具

    目录 基础故障处理工具 jps:虚拟机进程状况工具 jstat:虚拟机统计信息监视工具 jinfo:Java配置信息工具 jmap:Java内存映像工具 jhat:虚拟机堆转储快照分析工具 jstac ...

  8. 第4章 虚拟机性能监控、故障处理工具(上)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 4.1 概述 经过前面两章对于虚拟机内存分配与回收技术各方面的介绍,相信读者已经建立了一个比 ...

  9. 第4章 虚拟机性能监控与故障处理工具

    4.1 概述 一切尽在掌控之中(是不是暴露啥),学习JDK提供哪些免费,被我们忽略的工具 4.2 JDK的命令行工具 用的最多的就是java.exe  和 javac.exe ,其实你打开bin下更多 ...

最新文章

  1. python文件操作(open()、write()、read()、readline()、readlines()、seek()、os)
  2. 系统高可用设计与实践
  3. Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…
  4. GCD dispatch_semaphore
  5. Tools: geos 使用指南
  6. [剑指offer][JAVA][面试题第13题][机器人的运动][DFS][BFS]
  7. 分享一个基于jQuery,backbone.js和underscore.js的消息提示框架 - Backbone.Notifier
  8. mysql c 中文字符串_MySQL字符集中文乱码终极解决方案和mysql查询中文问题解决方法...
  9. wampserver的phpmyadmin(默认3306)端口如何更改为3307?
  10. Linux安装Swift开发环境
  11. 五种常见粗粮的最佳养生吃法
  12. 使用Spark分析拉勾网招聘信息(四): 几个常用的脚本与图片分析结果
  13. OpenAI升级Codex,直接将书面语言转为计算机代码;区块链网站被黑客偷走6亿美元加密货币|极客头条...
  14. iptables/arptables实现单IP一级二级路由
  15. 6.5. Properties
  16. fat32 linux 打包工具_UbuntuLinux默认安装图形化的压缩工具是File-Roller文件打包器.ppt...
  17. 手把手教你做一个简单的VB数据库程序
  18. 制作dnf脚本Java_易语言制作DNF解封源码
  19. 7-5 分段函数计算 (15 分)
  20. C++萌新来看,一篇文让你让你彻底搞定类(超详细)!

热门文章

  1. 数字图像处理——第三章 空间域图像增强(灰度变换和直方图处理)
  2. 服务器给站点读写权限,IIS7目录权限设置的问题详解Windows服务器操作系统 -电脑资料...
  3. 整数的二进制表达中有多少个1
  4. anaconda不同虚拟环境下使用jupyter的问题
  5. python 笔记:读取mat文件
  6. NTU 课程笔记:self-supervised learning
  7. 预训练模型需要知道的知识点总结,万字长文带你深入学习(建议收藏)
  8. 完全用链表实现的贪吃蛇
  9. 串口上升时间标准_JESD204B串行接口时钟需要及其实现
  10. 用Java API实现HDFS操作(三)问题汇总