VisualVM(All-in-One Java Troubleshooting Tool)是功能最强大的运行监视和故障处理程序之一,曾经在很长一段时间内时Oracle官方主力发展的虚拟机故障处理工具。VisualVM还有一个很大的优点:不需要被监视的程序基于特殊Agent去运行,因此它的通用性很强,对应用程序实际性能的影响也较小,使得它可以直接应用在生产环境中。
一、VisualVM兼容范围与插件安装
VisualVM基于NetBeans平台开发工具,所以一开始它就具备了通过插件扩展功能的能力,有了插件扩展支持,VisualVM可以做到:
- 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)
- 监视应用程序的处理器、垃圾收集、堆、方法区以及线程的信息(jstat、jstack)
- dump以及分析堆转储快照(jmap、jhat)
- 方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法
- 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者处进行Bug反馈
- 其他插件带来的无限可能性
二、生成、浏览堆转储快照
-
在“应用程序”窗口中右键单击应用程序节点,然后选择“堆dump”
image.png -
在“应用程序”窗口中双击应用程序节点以打开应用程序标签,然后在“监视”标签中单击“堆Dump”
image.png -
堆dump
@Service
@Slf4j
public class PayOrderFunctionsServiceImpl extends ServiceImpl<PayOrderFunctionsMapper, PayOrderFunctions> implements PayOrderFunctionsService {
@Autowired
private ThreadPoolExecutor executor;
@Autowired
private PayMemberEnterpriseService payMemberEnterpriseService;
@Autowired
private PayOrderFunctionsMapper payOrderFunctionsMapper;
}
堆dump.png
三、分析程序性能
-
在Profile页签中,VisualVm提供了程序运行期间方法级的处理器执行时间分析以及内存分析。做Profiling分析肯定会对程序运行性能;有比较大的影响,所以一般不在生成环境使用这项功能,或者改用JMC来完成,JMC的Profiling能力更强,对应用的影响非常轻微。
-
开始性能分析,先选择“CPU”和“内存”按钮中的一个,然后切换到应用程序中对程序进行操作,VisualVM会记录这段时间中应用程序执行过程的所有方法。
-
如果是进行处理器执行时间分析,将会统计每个方法的执行次数、执行耗时。
- 如果是内存分析,则会统计每个方法关联的对象数以及这些对象所占的空间。 image.png
四、BTrace动态日志跟踪
BTrace是一个很神奇的VisualVM插件,它本身也是一个可运行的独立程序。BTrace的作用是在不中断目标程序运行的前提下,通过HotSpot虚拟机的Instrument功能动态加入原本并不存在的调试代码。这项功能对实际生产中的程序很有意义:当程序出现问题时,排查错误的一些必要信息时(譬如方法参数、返回值),在开发时并没有打印到日志之中以至于不得不停掉服务时,都可以通过调试增量来加入日志代码以解决问题。
- 在VisualVM中安装BTrace插件
- 右键“应用程序”Trace Application选择 image.png
- BTrace image.png
BTrace实例
- 代码
package com.lkty.btrace;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BtraceTest {
public int add(int a, int b) {
return a + b;
}
public static void main(String[] args) throws IOException {
BtraceTest test = new BtraceTest();
BufferedReader reader = new BufferedReader(new InputStreamReader((System.in)));
for (int i = 0; i < 10; i++) {
reader.readLine();
int a = (int) Math.round(Math.random() * 1000);
int b = (int) Math.round(Math.random() * 1000);
System.out.println("随机数和 = " + test.add(a, b));
}
}
}
- BTrace中编写代码 image.png
- BTrace的用途很广泛,打印调用堆栈、参数、返回值只是它最基础的使用形式,在它的网站上有使用BTrace进行性能监视、定位连接泄露、内存泄露、解决多线程竞争问题等使用案例。
- BTrace能够实现动态修改程序行为,是因为它是基于 Java 虚拟机的 Instrument 开发的。Instrument是 Java虚拟机工具接口(Java Virtual Machine Tool Interface,JVMTI)的重要组件,提供了一套代理(Agent)机制,使得第三方工具程序可以以代理的方式访问和修改Java虚拟机内部的数据。
五、Java Mission Control: 可持续在线的监控工具
- 用于企业JRE定制管理的 AMC(Java Advanced Management Console)控制台、JUT(Java Usage Tracker)跟踪系统
- 用于持续收集数据的JFR(Java Flight Recorder)飞行记录仪,JFR是一套内建在HotSpot虚拟机里面的监控和基于事件的信息搜集框架,与其他的监控工具(如JProfiling)相比,Oracle特别强调它“可持续在线”的特性。
- 用于监控Java虚拟机的JMC(Java Mission Control)
网友评论