java故障处理(二)可视化工具

发布时间 2023-04-13 15:31:53作者: Mars.wang

一、JConsole: Java监视与管理控制台

命令行:jconsole

JConsole是一款基于JMX 的可视化监视、 管理工具。 它的主要功能是通过JMX的MBean( Managed Bean) 对系统进行信息收集和参数动态调整。 JMX是一种开放性的技术, 不仅可以用在虚拟机本身的管理上, 还可以 运行于虚拟机之上的软件中, 典型的如中间件大多也基于JMX来实现管理与监控。 虚拟机对JMX MBean的访问也是完全开放的, 可以使用代码调用API、 支持JMX协议的管理控制台, 或者其他符合JMX规范的软件进行访问

 

 

 

二、JHSDB:基于服务性代理的调试工具

1.案例:

#进入可视化模式
jhsdb hsdb --pid 11180  

 

 

 

三、VisualVM: 多合一故障处理工具

命令行:jvisualvm

 

VisualVM 是功能最强大的运行监视和故障处理程序之一,曾经在很长一段时间内是Oracle官方主力发展的虚拟机故障处理工具。

它除了常规的运行监视、 故障处理外, 还将提供其他方面的能力, 譬如性能分析( Profiling) 。

它的通用性很强, 对应用程序实际性能的影响也较小, 使得它可以直接应用在生产环境中。 这个优点是JProfiler、 YourKit等工具无法与之媲美的。

1.VisualVM兼容范围与插件安装

VisualVM基于NetBeans平台开发工具, 所以一开始它就具备了通过插件扩展功能的能力, 有了插件扩展支持, VisualVM可以做到:

·显示虚拟机进程以及进程的配置、 环境信息( jps、 jinfo) 。

·监视应用程序的处理器、 垃圾收集、 堆、 方法区以及线程的信息( jstat、 jstack) 。

·dump以及分析堆转储快照( jmap、 jhat) 。

·方法级的程序运行性能分析, 找出被调用最多、 运行时间最长的方法。

·离线程序快照: 收集程序的运行时配置、 线程dump、 内存dump等信息建立一个快照, 可以将快照发送开发者处进行Bug反馈。

·其他插件带来的无限可能性。

2.生成、 浏览堆转储快照

在VisualVM中生成堆转储快照文件有两种方式, 可以执行下列任一操作:

·在“应用程序”窗口中右键单击应用程序节点, 然后选择“堆Dump”。

·在“应用程序”窗口中双击应用程序节点以打开应用程序标签, 然后在“监视”标签中单击“堆Dump”。

3.分析程序性能

在Profiler页签中, VisualVM提供了程序运行期间方法级的处理器执行时间分析以及内存分析。 做Profiling分析肯定会对程序运行性能有比较大的影响, 所以一般不在生产环境使用这项功能, 或者改用JMC来完成, JMC的Profiling能力更强, 对应用的影响非常轻微。 要开始性能分析, 先选择“CPU”和“内存”按钮中的一个, 然后切换到应用程序中对程序进行操作, VisualVM会记录这段时间中应用程序执行过的所有方法。 如果是进行处理器执行时间分析, 将会统计每个方法的执行次数、 执行耗时; 如果是内存分析, 则会统计每个方法关联的对象数以及这些对象所占的空间。 等要分析的操作执行结束后, 点击“停止”按钮结束监控过程,

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类似的功能。

 

 

 

四、JMC:可持续在线的监控工具

命令行:jmc

JMC最初是BEA公司的产品, 因此并没有像VisualVM那样一开始就基于自家的Net-Beans平台来开发, 而是选择了由IBM捐赠的Eclipse RCP作为基础框架, 现在的JMC不仅可以下载到独立程序, 更常见的是作为Eclipse的插件来使用。 JMC与虚拟机之间同样采取JMX协议进行通信, JMC一方面作为JMX控制台, 显示来自虚拟机MBean提供的数据; 另一方面作为JFR的分析工具, 展示来自JFR的数据。

如果需要监控其他服务器上的虚拟机, 可在“文件->连接”菜单中创建远程连接,

这里要填写的信息应该在被监控虚拟机进程启动的时候以虚拟机参数的形式指定, 以下是一份被 监控端的启动参数样例:

-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.31.4
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder

本地虚拟机与远程虚拟机进程的差别只限于创建连接这个步骤, 连接成功创建以后的操作就是完全一样的了。 把“JVM浏览器”面板中的进程展开后, 可以看到每个进程的数据都有MBean和JFR两个 数据来源。 关于MBean这部分数据, 与JConsole和VisualVM上取到的内容是一样的, 只是展示形式上 有些差别.

飞行记录报告里包含以下几类信息: ·一般信息: 关于虚拟机、 操作系统和记录的一般信息。

·内存: 关于内存管理和垃圾收集的信息。

·代码: 关于方法、 异常错误、 编译和类加载的信息。

·线程: 关于应用程序中线程和锁的信息。

·I/O: 关于文件和套接字输入、 输出的信息。

·系统: 关于正在运行Java虚拟机的系统、 进程和环境变量的信息。

·事件: 关于记录中的事件类型的信息, 可以根据线程或堆栈跟踪, 按照日志或图形的格式查看。

JFR的基本工作逻辑是开启一系列事件的录制动作, 当某个事件发生时, 这个事件的所有上下文数据将会以循环日志的形式被保存至内存或者指定的某个文件当中, 循环日志相当于数据流被保留在一个环形缓存中, 所以只有最近发生的事件的数据才是可用的。 JMC从虚拟机内存或者文件中读取并展示这些事件数据, 并通过这些数据进行性能分析。