Java虚拟机-第4章笔记-虚拟机性能监控-故障处理工具
2022-01-20 17:17:17 0 举报
AI智能生成
Java虚拟机-第4章笔记-虚拟机性能监控-故障处理工具
作者其他创作
大纲/内容
4.1 概述
给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。
异常堆栈、虚拟机运行日志、垃圾收集器日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)。
工具永远都是知识技能的一层包装,没有什么工具是“秘密武器”,拥有了就能“包治百病”。
4.2 基础故障处理工具
0. 概述
选择采用Java语言本身来实现这些故障处理工具
当应用程序部署到生产环境后,无论是人工物理接触到服务器还是远程Telnet到服务器上都可能会受到限制。
借助这些工具类库里面的接口和实现代码,开发者可以选择直接在应用程序中提供功能强大的监控分析功能。
启用 JMX 功能
JDK5或以下版本,在程序启动时请添加参数“-Dcom.sun.management.jmxremote”开启JMX管理功能。
JDK6或以上版本,默认开启了JMX管理。
1. jps:虚拟机进程状况工具
jps(JVM Process Status Tool)
作用:列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)。
jps命令格式:jps [ options ] [ hostid ]
jps工具主要选项
图片
2. jstat:虚拟机统计信息监视工具
jstat(JVM Statistics Monitoring Tool)
作用:显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据,在没有GUI图形界面、只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的常用工具。
jstat命令格式为:jstat [ option vmid [interval[s|ms] [count]] ]
如果是本地虚拟机进程,VMID与LVMID是一致的
如果是远程虚拟机进程,那VMID的格式应当是: [protocol:][//]lvmid[@hostname[:port]/servername]
参数interval和count代表查询间隔和次数,如果省略这2个参数,说明只查询一次。
示例:假设需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是: jstat -gc 2764 250 20
jstat工具主要选项
图片
jstat执行样例
图片
新生代Eden区(E,表示Eden)使用了6.2%的空间
2个Survivor区(S0、S1,表示Survivor0、Survivor1)里面都是空的
老年代(O,表示Old)和永久代(P,表示Permanent)则分别使用了41.42%和47.20%的空间
程序运行以来共发生Minor GC(YGC,表示Young GC)16次,总耗时0.105秒
发生Full GC(FGC,表示Full GC)3次,总耗时(FGCT,表示Full GC Time)为0.472秒
所有GC总耗时(GCT,表示GC Time)为0.577秒
在实际生产环境中不一定可以使用图形界面,直接在控制台中使用jstat命令依然是一种常用的监控方式。
3. jinfo:Java配置信息工具
jinfo(Configuration Info for Java)
作用:实时查看和调整虚拟机各项参数。
JDK 6之后,加入了在运行期修改部分参数值的能力(可以使用-flag[+|-]name或者-flag name=value在运行期修改一部分运行期可写的虚拟机参数值)。
JDK 6或以上版本的话,使用java-XX:+PrintFlagsFinal查看参数默认值。
jinfo命令格式:jinfo [ option ] pid
4. jmap:Java内存映像工具
jmap(Memory Map for Java)
作用:生成堆转储快照(一般称为heapdump或dump文件),查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
非jmap命令获取堆转储快照
通过-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出异常出现之后自动生成堆转储快照文件。
通过-XX:+HeapDumpOnCtrlBreak参数则可以使用[Ctrl]+[Break]键让虚拟机生成堆转储快照文件,又或者在Linux系统下通过Kill-3命令发送进程退出信号“恐吓”一下虚拟机,也能顺利拿到堆转储快照。
jmap命令格式:jmap [ option ] vmid
jmap工具主要选项
图片
5. jhat:虚拟机堆转储快照分析工具
jhat(JVM Heap Analysis Tool)
作用:与jmap搭配使用,来分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。
注意:实际很少使用jhat分析堆转储快照文件
一般不会在部署应用程序的服务器上直接分析堆转储快照,因为分析工作是一个耗时而且极为耗费硬件资源的过程。
jhat的分析功能相对来说比较简陋。
有比jhat更好的分析工具:VisualVM、Eclipse Memory Analyzer、IBM HeapAnalyzer
分析内存泄漏问题主要会使用到其中的“HeapHistogram”(与jmap-histo功能一样)与OQL页签的功能,前者可以找到内存中总容量最大的对象。
6. jstack:Java堆栈跟踪工具
jstack(Stack Trace for Java)
作用:用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。
jstack命令格式:jstack [ option ] vmid
jstack工具主要选项
图片
7. 基础工具总结
基础工具
用于支持基本的程序创建和运行
安全工具
用于程序签名、设置安全测试等
国际化工具
用于创建本地语言文件
远程方法调用工具
用于跨Web或网络的服务交互
性能监控和故障处理工具
用于监控分析Java虚拟机运行信息,排查问题
Java IDL与RMI-IIOP
在JDK 11中结束了十余年的CORBA支持,这些工具不再提供
部署工具
用于程序打包、发布和部署
Java Web Start
图片
WebService工具
与CORBA一起在JDK 11中被移除
REPL和脚本工具
图片
4.3 可视化故障处理工具
1. JHSDB:基于服务性代理的调试工具
JDK 9
简介
JHSDB是一款基于服务性代理(Serviceability Agent,SA)实现的进程外调试工具。
服务性代理是HotSpot虚拟机中一组用于映射Java虚拟机运行信息的、主要基于Java语言(含少量JNI代码)实现的API集合。
服务性代理以HotSpot内部的数据结构为参照物进行设计,把这些C++的数据抽象出Java模型对象,相当于HotSpot的C++代码的一个镜像。
通过服务性代理的API,可以在一个独立的Java虚拟机的进程里分析其他HotSpot虚拟机的内部数据,或者从HotSpot虚拟机进程内存中dump出来的转储快照里还原出它的运行状态细节。
服务性代理的工作原理跟Linux上的GDB或者Windows上的Windbg是相似的。
JCMD、JHSDB和基础工具的对比
图片
JHSDB的界面
图片
2. JConsole:Java监视与管理控制台
JDK 5
简介
JConsole(Java Monitoring and Management Console)是一款基于JMX(Java Manage-ment Extensions)的可视化监视、管理工具。
它的主要功能是通过JMX的MBean(Managed Bean)对系统进行信息收集和参数动态调整。
JMX是一种开放性的技术,不仅可以用在虚拟机本身的管理上,还可以运行于虚拟机之上的软件中,典型的如中间件大多也基于JMX来实现管理与监控。
虚拟机对JMX MBean的访问也是完全开放的,可以使用代码调用API、支持JMX协议的管理控制台,或者其他符合JMX规范的软件进行访问。
JMX支持跨服务器的管理,也可以使用下面的“远程进程”功能来连接远程服务器,对远程虚拟机进行监控。
JConsole主界面
图片
3. JVisualVM:多合一故障处理工具
JDK 6
简介
功能最强大的运行监视和故障处理程序之一,曾经在很长一段时间内是Oracle官方主力发展的虚拟机故障处理工具。
除了常规的运行监视、故障处理外,还将提供其他方面的能力,譬如性能分析(Profiling)。
VisualVM还有一个很大的优点:不需要被监视的程序基于特殊Agent去运行,因此它的通用性很强,对应用程序实际性能的影响也较小,使得它可以直接应用在生产环境中。
如果不在VisualVM上装任何扩展插件,就相当于放弃它最精华的功能,和没有安装任何应用软件的操作系统差不多。
特性
1. VisualVM通过插件扩展功能
显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)。
监视应用程序的处理器、垃圾收集、堆、方法区以及线程的信息(jstat、jstack)。
dump以及分析堆转储快照(jmap、jhat)。
方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法。
离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者处进行Bug反馈。
其他插件带来的无限可能性。
2. 生成、浏览堆转储快照
在“应用程序”窗口中右键单击应用程序节点,然后选择“堆Dump”。
在“应用程序”窗口中双击应用程序节点以打开应用程序标签,然后在“监视”标签中单击“堆Dump”。
3. 分析程序性能
在Profiler页签中,VisualVM提供了程序运行期间方法级的处理器执行时间分析以及内存分析。
做Profiling分析肯定会对程序运行性能有比较大的影响,所以一般不在生产环境使用这项功能,或者改用JMC来完成,JMC的Profiling能力更强,对应用的影响非常轻微。
4. BTrace动态日志跟踪
BTrace 是一个很神奇的VisualVM插件,它本身也是一个可运行的独立程序。
BTrace的作用是在不中断目标程序运行的前提下,通过HotSpot虚拟机的Instrument功能动态加入原本并不存在的调试代码。对实际生产中的程序很有意义:如当程序出现问题时,排查错误的一些必要信息时(譬如方法参数、返回值等),在开发时并没有打印到日志之中以至于不得不停掉服务时,都可以通过调试增量来加入日志代码以解决问题。
BTrace的用途很广泛,打印调用堆栈、参数、返回值只是它最基础的使用形式,在它的网站上有使用BTrace进行性能监视、定位连接泄漏、内存泄漏、解决多线程竞争问题等的使用案例。
BTrace能够实现动态修改程序行为,是因为它是基于Java虚拟机的Instrument开发的。Instrument是Java虚拟机工具接口(Java Virtual Machine Tool Interface,JVMTI)的重要组件,提供了一套代理(Agent)机制,使得第三方工具程序可以以代理的方式访问和修改Java虚拟机内部的数据。阿里巴巴开源的诊断工具Arthas也通过Instrument实现了与BTrace类似的功能。
4. Java Mission Control(JMC):可持续在线的监控工具
JDK 7(商业工具)
JMC主界面
图片
特点
在个人开发环境中,允许免费使用JMC和JFR;需要商业授权才能在生产环境中使用。
JMC与虚拟机之间同样采取JMX协议进行通信,JMC一方面作为JMX控制台,显示来自虚拟机MBean提供的数据;另一方面作为JFR的分析工具,展示来自JFR的数据。
JFR是一套内建在HotSpot虚拟机里面的监控和基于事件的信息搜集框架,与其他的监控工具(如JProfiling)相比,Oracle特别强调它“可持续在线”(Always-On)的特性。
JFR在生产环境中对吞吐量的影响一般不会高于1%,而且JFR监控过程的开始、停止都是完全可动态的,即不需要重启应用。
JFR的监控对应用也是完全透明的,即不需要对应用程序的源码做任何修改,或者基于特定的代理来运行。
JFR的基本工作逻辑是开启一系列事件的录制动作,当某个事件发生时,这个事件的所有上下文数据将会以循环日志的形式被保存至内存或者指定的某个文件当中,循环日志相当于数据流被保留在一个环形缓存中,所以只有最近发生的事件的数据才是可用的。JMC从虚拟机内存或者文件中读取并展示这些事件数据,并通过这些数据进行性能分析。
飞行记录报告
图片
飞行记录报告里包含以下几类信息
一般信息:关于虚拟机、操作系统和记录的一般信息。
内存:关于内存管理和垃圾收集的信息。
代码:关于方法、异常错误、编译和类加载的信息。
线程:关于应用程序中线程和锁的信息。
I/O:关于文件和套接字输入、输出的信息。
系统:关于正在运行Java虚拟机的系统、进程和环境变量的信息。
事件:关于记录中的事件类型的信息,可以根据线程或堆栈跟踪,按照日志或图形的格式查看。
JFR提供的数据质量通常也要比其他工具通过代理形式采样获得或者从MBean中取得的数据高得多。
4.4 HotSpot虚拟机插件及工具
HSDIS:JIT生成代码反汇编
JITWatch:是HSDIS经常搭配使用的可视化的编译日志分析工具,可以看到执行期间使用过的各种对象类型和对应调用过的方法了。
如果导图对您有用,请在右上角给点个赞吧
0 条评论
下一页