读书笔记 ---- 《深入理解Java虚拟机》---- 第4篇:虚拟机性能监控与故障处理工具

 2019-12-22 10:52  阅读(1062)
文章分类:JVM

上一篇:垃圾收集器:https://blog.csdn.net/pcwl1206/article/details/84197088

本文转自:https://blog.csdn.net/WSYW126/article/details/62422005

第4篇:虚拟机性能监控与故障处理工具

一 JDK的命令行工具

1 jps:虚拟机进程状况工具

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

3 jmap:java内存映像工具

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

5 jstack:java堆栈跟踪工具

7 HSDIS:JIT生成代码反汇编

二 JDK的可视化工具

1 JConsole

2 VisualVM:多合一故障处理工具

本文主要讲解虚拟机性能监控与故障处理工具,主要包括两大类:JDK的命令行工具JDK的可视化工具。

本文只对它们的命令和功能做出介绍:

给一个系统定位问题的时候,知识、经验是关键基础,数据是依据。工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照文件(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。

## JDK的命令行工具

JDK的命令行工具大多数是对jdk/lib/tools.jar类库的一层薄包装而已,它们的主要功能代码是在tools类库中实现的。Linux下的这些工具有的甚至是用shell脚本编写的。

SUN JDK监控和故障处理工具:

2019120001377\_1.png

一 JDK的命令行工具

1 jps:虚拟机进程状况工具

以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID。

jps命令格式: jps [options] [hostid]

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

jps常用的选项:

2019120001377\_2.png

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

jstat是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾回收、JIT编译等运行数据,在没有GUI图形界面,只是提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。

jstat的命令格式:jstat [option vmid [interval [s|ms] [count]] ]

对于命令格式中的VMID和LVMID,如过是本地虚拟机进程,VMID和LVMID是一致的,如果是远程虚拟机,那VMID的格式应当是:[protocol:] [//] lvmid[@hostname[:port]/servername].

参数interval 和count分别表示查询的间隔和次数,如果省略这两个参数,说明只查询一次。

2019120001377\_3.png

3 jmap:java内存映像工具

jmap命令用于生成堆转储快照。jmap的作用并不仅仅为了获取dump文件,它还可以查询finalize执行队列、java堆和永久代的详细信息。如空间使用率、当前用的是哪种收集器等。

和jinfo命令一样,jmap在windows下也受到比较大的限制。除了生成dump文件的-dump选项和用于查看每个类的实例、控件占用统计的-histo选项在所有操作系用都提供之外,其余选项只能在linux/solaris下使用。

jmap格式:jmap [option] vmid

2019120001377\_4.png

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

Sun JDK提供jhat与jmap搭配使用,来分析dump生成的堆快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看。

用法举例: jhat test1.bin

test1.bin为生成的dump文件。

屏幕显示“Server is ready.”的提示后,用户在浏览器中键入http://localhost:7000就可以看到分析的结果了。

分析结果默认是以包围单位进行分组显示,分析内存泄漏问题主要会使用到其中的“Heap Histogram”与OQL标签的功能。前者可以找到内存中总容量最大的对象。后者是标准的对象查询语言,使用类似SQL的语法对内存中的对象进行查询统计。

5 jstack:java堆栈跟踪工具

jstack命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部资源导致长时间等待等。

jstack 格式:jstack [option] vmid

option选项的合法值和具体含义

2019120001377\_5.png

Tread类新增了一个getAllStackTraces()方法用于获取虚拟机中所有的线程的StackTraceElement对象。

7 HSDIS:JIT生成代码反汇编

在Java虚拟机规范中,详细描述了虚拟机指令集中每条指令的执行过程、执行前后对操作数栈、局部变量表的影响等细节。这些细节描述与Sun的早期虚拟机(Sun Classic VM)高度吻合,但随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述的内容产生了越来越大的差距,虚拟机规范中的描述逐渐成了虚拟机实现的“概念模型”——即实现只能保证规范描述等效。基于这个原因,我们分析程序的执行语义问题(虚拟机做了什么)时,在字节码层面上分析完全可行,但分析程序的执行行为问题(虚拟机是怎样做的、性能如何)时,在字节码层面上分析就没有什么意义了,需要通过其他方式解决。

分析程序如何执行,通过软件调试工具(GDB、Windbg等)来断点调试是最常见的手段,但是这样的调试方式在Java虚拟机中会遇到很大困难,因为大量执行代码是通过JIT编译器动态生成到CodeBuffer中的,没有很简单的手段来处理这种混合模式的调试(不过相信虚拟机开发团队内部肯定是有内部工具的)。因此,不得不通过一些特别的手段来解决问题,基于这种背景,本节的主角——HSDIS插件就正式登场了。

HSDIS是一个Sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件,它包含在HotSpot虚拟机的源码之中,但没有提供编译后的程序。在Project Kenai的网站也可以下载到单独的源码。它的作用是让HotSpot的-XX:+PrintAssembly指令调用它来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就可以通过输出的代码来分析问题。读者可以根据自己的操作系统和CPU类型从Project Kenai的网站上下载编译好的插件,直接放到JDK_HOME/jre/bin/client和JDK_HOME/jre/bin/server目录中即可。如果没有找到所需操作系统(譬如Windows的就没有)的成品,那就得自己使用源码编译一下。

还需要注意的是,如果读者使用的是Debug或者FastDebug版的HotSpot,那可以直接通过-XX:+PrintAssembly指令使用插件;如果使用的是Product版的HotSpot,那还要额外加入一个-XX:+UnlockDiagnosticVMOptions参数。

二 JDK的可视化工具

JDK中除了提供大量的命令行工具外,还有两个功能强大的可视化工具:JConsoleVisualVM

1 JConsole

JConsole工具在JDK/bin目录下,启动JConsole后,将自动搜索本机运行的jvm进程,不需要jps命令来查询指定。双击其中一个jvm进程即可开始监控,也可使用“远程进程”来连接远程服务器。

2 VisualVM:多合一故障处理工具

VisualVM是一个集成多个JDK命令行工具的可视化工具。VisualVM基于NetBeans平台开发,它具备了插件扩展功能的特性,通过插件的扩展,可用于显示虚拟机进程及进程的配置和环境信息(jps,jinfo),监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat、jstack)等。VisualVM在JDK/bin目录下。

VisualVM的性能分析功能甚至比起JProfiler、YourKit等专业且收费的Profiling工具都不会逊色多少,而且VisualVM还有一个很大的优点:不需要被监视的程序基于特殊Agent运行,因此它对应用程序的实际性能的影响很小,使得它可以直接应用在生产环境中。这个优点是JProfiler、YourKit等工具无法与之媲美的。

上一篇:垃圾收集器:https://blog.csdn.net/pcwl1206/article/details/84197088

下一篇:类文件结构:https://blog.csdn.net/pcwl1206/article/details/84197219

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> 读书笔记 ---- 《深入理解Java虚拟机》---- 第4篇:虚拟机性能监控与故障处理工具

相关推荐