VisualVM实战指南:从插件安装到远程JVM监控

张开发
2026/4/20 0:36:22 15 分钟阅读

分享文章

VisualVM实战指南:从插件安装到远程JVM监控
1. VisualVM入门你的JVM性能分析利器第一次听说VisualVM时我也和大多数Java开发者一样疑惑这工具到底能干什么简单来说它就是JVM的体检中心能实时查看内存泄漏、线程死锁、CPU过载等问题。我在电商系统性能调优时就是靠它发现了那个让服务器崩溃的缓存雪崩问题。作为JDK自带的神器VisualVM不需要额外安装只要配置好JDK环境变量在命令行输入jvisualvm就能启动。不过原生功能有限就像刚买的新手机不装APP很多功能用不了。我们需要通过插件扩展它的能力这也是为什么教程总是从插件安装开始讲起。2. 插件安装全攻略避开那些坑2.1 官方插件中心使用技巧打开VisualVM的第一件事就是直奔插件中心。官方地址经常变动建议直接收藏这个万能入口https://visualvm.github.io。我遇到过不少开发者卡在第一步——选择适配自己JDK版本的插件中心。这里有个小窍门VisualVM 2.0需要对应JDK 11的插件中心老版本则要选JDK 8的。下载插件时要注意依赖关系。比如想用GC插件分析垃圾回收必须先安装Visual GC插件。有次我排查内存泄漏时就因为没有安装OQL控制台插件差点错过关键线索。建议新手必装三件套Visual GC垃圾回收可视化BTrace Workbench动态追踪OQL Console对象查询语言工具2.2 离线安装的隐藏技巧企业内网环境无法直连插件中心怎么办我常用的解决方案是在外网机器下载.nbm格式插件包在VisualVM界面选择工具→插件→已下载→添加插件勾选插件后点击安装最近帮银行做系统优化时就遇到插件安装失败的问题原因是他们用的JDK是定制版本。这种情况可以尝试修改visualvm.conf文件增加-J-Dnetbeans.proxyDIRECT绕过代理检测。3. 本地监控实战从入门到精通3.1 基础监控指标解读双击本地Java进程后你会看到六个核心面板概述显示PID、JVM参数等基础信息监视动态折线图展示堆内存、CPU、类加载情况线程实时查看线程状态特别适合排查死锁抽样器CPU和内存使用热点分析Profiler更精细的性能分析但会影响性能Visual GC垃圾回收详情需安装插件上周排查一个线上问题时通过线程面板发现有个后台线程卡在WAITING状态最终定位到是数据库连接池配置不当导致的。3.2 内存泄漏排查实战遇到OutOfMemoryError别慌按这个流程走在监视页签观察老年代内存曲线是否持续上升使用堆Dump功能生成内存快照在类标签页按实例数排序重点检查数量异常多的自定义类有次发现某个缓存工具类实例数高达50万原来是开发同学忘记设置过期时间。通过OQL控制台输入查询语句select s from java.lang.String s where s.count 1000快速定位到了问题数据。4. 远程监控高阶技巧4.1 JMX连接避坑指南配置远程JMX连接时这几个参数最容易出错-Dcom.sun.management.jmxremote.port8999 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.management.jmxremote.authenticatefalse -Djava.rmi.server.hostname你的服务器真实IP特别提醒如果服务器有多个网卡hostname必须指定外部可访问的IP。去年双十一大促前我们的监控突然失效就是因为运维同学升级网络设备后IP绑定发生了变化。4.2 安全加固方案生产环境不建议直接关闭认证可以这样配置密码文件创建jmxremote.password文件monitorRole 123456 controlRole 654321修改文件权限为600启动参数改为-Dcom.sun.management.jmxremote.authenticatetrue -Dcom.sun.management.jmxremote.access.file../conf/jmxremote.access -Dcom.sun.management.jmxremote.password.file../conf/jmxremote.password5. 性能分析实战案例5.1 CPU飙高问题定位遇到CPU使用率100%时在抽样器页签点击CPU按自用时间排序查看热点方法调用树最近优化一个订单查询接口时发现String.split()方法占用了85%的CPU时间。改用StringUtils.substring()后性能提升20倍。5.2 线程死锁检测VisualVM的线程面板会自动标记死锁线程。有次凌晨收到报警通过远程连接看到两个线程互相持有对方需要的锁Thread-A waiting to lock 0x000000076ab766d8 (held by Thread-B) Thread-B waiting to lock 0x000000076ab766e8 (held by Thread-A)通过线程堆栈很快定位到是分布式锁释放逻辑有问题。6. 高级技巧与插件开发6.1 BTrace动态追踪当需要监控线上环境但无法修改代码时BTrace是救命稻草。比如要监控某个方法的入参OnMethod(clazzcom.example.Service, methodprocess) public static void logArgs(ProbeClassName String pcn, ProbeMethodName String pmn, AnyType[] args) { println(调用 pcn . pmn); printArray(args); }6.2 自定义插件开发VisualVM支持用NetBeans SDK开发自定义插件。我司就开发了专门监控MQ消息堆积的插件关键代码结构ServiceProvider(servicePlugin.class) public class MyPlugin extends Plugin { Override public void setup() { DataSourceProvider.registerProvider(new MyDataSource()); } }记得在manifest.mf中声明依赖OpenIDE-Module-Module-Dependencies: org.netbeans.modules.profiler.api/1 1.0

更多文章