visualvm远程内存排查核心是安全连接与精准监控:需配置jmx参数(含rmi主机名和端口)、启用visualgc插件,并通过“监视器”观察堆内存锯齿状趋势及old gen持续增长来初筛泄漏。

VisualVM 远程连接做内存排查,核心在于两件事:让远程 JVM 可被安全访问,以及用 VisualVM 正确拿到它的实时堆和 GC 数据。重点不是“连上就行”,而是连得稳、看得清、判得准。
远程 JVM 启动时必须加的关键参数
只开一个端口远远不够。JMX 远程连接依赖 RMI 通信,若不显式指定主机名和 RMI 端口,JVM 可能绑定到 127.0.0.1 或随机端口,导致连接失败或超时。
-
-Djava.rmi.server.hostname=实际外网IP(如
172.22.33.20)——这是最关键的一步,告诉 RMI “我对外暴露的地址是什么” - -Dcom.sun.management.jmxremote.port=9010——JMX 主监听端口,需在服务器防火墙放行
- -Dcom.sun.management.jmxremote.rmi.port=9010——强制 RMI 使用同一端口,避免动态端口带来的防火墙配置麻烦
-
-Dcom.sun.management.jmxremote.authenticate=false 和 -Dcom.sun.management.jmxremote.ssl=false——仅限内网测试环境;生产环境必须启用认证(配
jmxremote.password文件)并启用 SSL
VisualVM 侧连接方式选 JMX 而非 jstatd
虽然 jstatd 也能连,但它不支持 VisualGC 插件、无法查看对象年龄分布、不能触发堆 Dump,对内存泄漏分析帮助有限。JMX 是更直接、信息更全的选择。
- 启动 VisualVM 后,在左侧“远程”节点右键 → “添加 JMX 连接”
- 填入服务器 IP 和上面配置的端口(如
172.22.33.20:9010) - 连接成功后,不要急着点 VisualGC —— 先切到“监视器”标签页,观察堆内存曲线是否呈现规律性“锯齿状”升降。如果堆持续攀升、GC 后回收极少,才说明存在可疑泄漏
确认 VisualGC 插件已安装并生效
VisualGC 是内存行为可视化的核心插件,但 JDK 自带的 VisualVM(JDK 8 及以前)默认不包含它。
- 菜单栏 → “工具” → “插件” → 切换到“可用插件”标签页
- 勾选 Visual GC,点击“安装”,按提示完成(需重启 VisualVM)
- 连接远程应用后,在主界面顶部标签中应出现 VisualGC 选项卡;若没有,说明插件未生效或远程连接未走 JMX(比如误用了 jstatd)
内存泄漏初筛:看趋势,不看瞬时值
单次截图意义不大。真正有价值的判断来自持续观察:
- 让应用在典型业务负载下运行 10–15 分钟,重点关注“堆”曲线是否逐步抬高基线
- 观察 Full GC 频率是否明显增加、每次耗时是否变长
- 在 VisualGC 中留意“Old Gen”使用量是否持续增长且不回落,Eden 区频繁 Young GC 却不见 Old Gen 回收 —— 这是典型泄漏信号
- 确认无误后,再右键应用 → “堆 Dump”,生成
hprof文件,本地用 VisualVM 或 MAT 进一步分析大对象和引用链
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











