必须添加-Dcom.sun.management.jmxremote作为JMX开关,否则jconsole无法连接本地或远程JVM;配套还需-Dcom.sun.management.jmxremote.port、-Djava.rmi.server.hostname等参数,缺一不可。

启动时必须加的JVM参数才能用jconsole连上
不加 -Dcom.sun.management.jmxremote,jconsole 连本地进程都可能失败,更别说远程。这个参数是JMX监控的开关,缺了它,所有基于JMX的工具(包括jconsole、VisualVM、Prometheus JMX Exporter)都收不到数据。
常见漏掉的配套参数也得一起加,否则会连不上或认证失败:
-
-Dcom.sun.management.jmxremote.port=9999:指定监听端口,别用默认 1099(常被防火墙拦截) -
-Dcom.sun.management.jmxremote.authenticate=false:开发/测试环境可关认证;生产环境必须开,配access.properties和password.properties -
-Dcom.sun.management.jmxremote.ssl=false:内网调试可关;外网务必开SSL或走反向代理隔离 -
-Djava.rmi.server.hostname=你的服务器IP:关键!不设这个,RMI会返回 localhost 或主机名,jconsole 无法回连
jconsole连不上远程Java进程的典型错误
看到 Connection failed: Connection refused 或 Unable to connect to the target VM,八成是网络或RMI地址问题。
先在服务端验证端口是否真在监听:netstat -tuln | grep 9999。没输出?说明JVM根本没成功绑定端口——检查是否漏写了 -Djava.rmi.server.hostname,或者端口被其他进程占用了。
如果端口通了但还是连不上,抓包看 jconsole 实际连的是哪个地址:tcpdump -i any port 9999 -nn -A。经常发现它连到了 127.0.0.1:9999,而实际RMI注册的服务地址却是 localhost:xxx(中间跳转端口随机),这是RMI默认行为导致的“双端口陷阱”。解决办法只有一个:-Dcom.sun.management.jmxremote.rmi.port=9999,强制RMI使用和JMX相同的端口。
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
用jconsole看什么指标最能快速定位线上问题
别一上来就翻“VM Summary”或“MBeans”标签页。重点关注三个面板:
- Memory:看“Used”曲线是否持续上涨且不回落,配合“GC”页看 Full GC 频次。如果 Eden 区刚回收完立刻又满,说明对象生命周期短但创建太猛;如果老年代缓慢上涨,可能是内存泄漏
- Threads:点“Detect Deadlock”按钮,秒出死锁线程栈;再看“Total Started”和“Current Thread Count”差值,如果前者远大于后者,说明大量线程已退出,属正常;但如果“Current”长期 >500 且波动小,得查是不是线程池没复用或泄露
- Classes:观察“Loaded Class Count”是否随时间单边上涨。Spring Boot 应用在热部署或反复加载类时容易飙高,上线后应趋于平稳。突增往往意味着动态代理、Groovy脚本或OSGi模块加载异常
为什么不用jconsole做长期监控
jconsole 是诊断工具,不是监控系统。它没有数据存储、没有告警、不能画趋势图,连接断开后历史数据全丢。
真正要盯线上,得把JMX指标导出来:jmx_exporter + Prometheus 是目前最轻量可靠的组合。一个 yaml 配置文件就能把 JVM 内存、线程、GC 等指标暴露成 HTTP 接口,Prometheus 定期拉取,Grafana 画图,阈值一超自动发钉钉/企微。
容易被忽略的一点:OpenJDK 17+ 默认禁用部分JMX MBean(比如 java.lang:type=Runtime 的某些属性)。如果用新版 JDK 却发现指标缺失,检查 jmx_exporter 日志里有没有 AttributeNotFoundException,对应加上 whitelistObjectNames 显式声明要采集的 MBean。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










