天天看点

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

思维导图

概述

命令行工具

jps 虚拟机进程状况工具

语法及使用

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

jinfo Java配置信息工具

jmap Java 内存映射工具

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

jstack Java堆栈跟踪工具

hsdis:jit生成代码反汇编

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

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

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

运行日志

异常堆栈

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堆栈跟踪工具,,显示线程快照

Java Virtual Machine Process Status Tool

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

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

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

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

jps的其他常用选项

选项

-q

只输出LVMID,省略主类的名称

-m

输出虚拟机进程启动时传递给主类main函数的参数

-l

输出主类的全名,如果执行的是jar包,输出jar路径

-v

输出虚拟机进程启动时jvm参数

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

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

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

对于命令格式中的VMID和LVMID,如果是本地虚拟机进程,两者一致。如果是远程虚拟机进程,则VMID的格式为

<code>[protocol:][//]lvmind[@hostname[:port]/servername]</code>

interval : 查询间隔

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

假设需要250毫秒查询一次进程3245的垃圾收集状况,一共查询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编译的方法

使用举例

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命令仍然是一种常用的监控方式。

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

jmap的主要选项

-dump

生成java堆转储快照。 格式为 -dump:[live,] format=b,file=<code>&lt;filename&gt;</code> 其中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信息

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

用法举例

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

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

jstack的主要选项

当正常输出的请求不被响应时,强制输出线程堆栈

如果调用到本地方法的话,可以显示C/C++的堆栈

除了堆栈信息,显示关于锁的附件信息

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

继续阅读