远程调试必须添加-agentlib:jdwp参数,JDK 11+需用address=*:5005,IDEA配置Remote JVM Debug并确保源码与class版本一致、防火墙开放端口、网络可达。

远程调试前必须加的 JVM 启动参数
IDEA 本身不启动 Java 进程,它只连接已运行的 JVM。所以关键不是 IDEA 设置,而是服务端 JVM 必须以调试模式启动,并开放 JDWP(Java Debug Wire Protocol)端口。-agentlib:jdwp 是唯一有效方式,其他如 jdb 或 IDE 自带的“远程运行”按钮都无效。
常见错误现象:Connection refused 或 IDEA 显示 “Unable to open debugger port”,90% 是因为没加参数,或加了但服务根本没重启。
-
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005(JDK 8/9/10) - JDK 11+ 必须用
address=*:5005,不能写5005(否则只监听 localhost) -
suspend=n表示启动不阻塞;suspend=y会卡住,直到调试器连上——适合排查启动阶段问题 - 确保 Linux 防火墙放行该端口:
sudo ufw allow 5005或检查iptables
IDEA 里配 Remote JVM Debug 的真实操作路径
别在 Run → Edit Configurations 里瞎找“Remote”模板——那个是旧版遗留项,实际要用的是 Remote JVM Debug 类型,位置藏得有点深。
使用场景:你已有正在跑的 Java 进程,且确认它带了 -agentlib:jdwp 参数并监听了可访问地址。
立即学习“Java免费学习笔记(深入)”;
- 点击右上角
Add Configuration→+→ 搜索Remote JVM Debug(不是 “Remote” 或 “Remote Debug”) -
Host填服务器 IP(不是localhost,除非你在服务器本机用 IDEA) -
Port填启动参数里写的端口号,比如5005 -
Module classpath必须选对模块——否则断点会灰色不可用,IDEA 找不到源码匹配 - 点
Debug,不是Run;连上后状态栏会显示Connected
断点不生效?先查这三件事
远程调试最常卡在这一步:断点红了,但程序跑过去没停。不是 IDEA 问题,而是环境链路没对齐。
性能影响:JDWP 本身不显著拖慢运行,但频繁触发断点、变量求值会卡住目标 JVM。
- 确认远程 class 文件和 IDEA 里打开的源码版本一致——
javap -c YourClass和本地.java行号是否对应 - 检查是否启用了
Build project automatically(Settings → Build → Compiler),否则改完代码没 recompile,远程还是旧 class - Spring Boot 用户注意:
spring-boot-devtools会干扰远程调试,建议远程部署时排除它,或关掉restart功能
Linux 服务器上怎么确认 JDWP 真的在监听
光看日志说“Started Application”没用。得亲手验证端口是否真被 JVM 占用并可外部访问。
兼容性影响:某些云主机(如阿里云 ECS)默认安全组屏蔽所有非 HTTP/HTTPS 端口,即使 netstat 显示监听,外网也连不上。
- 登录服务器,执行
netstat -tuln | grep :5005—— 应看到*:5005或0.0.0.0:5005,不是127.0.0.1:5005 - 从本地机器执行
telnet your-server-ip 5005,能通才说明网络层 OK - 如果用 Docker,容器启动时要加
-p 5005:5005,且 JVM 参数里的address仍需写*:5005,不能写0.0.0.0
最容易被忽略的点:JDK 版本差异导致参数失效。JDK 8 和 JDK 17 对 address 的解析逻辑不同,同一段启动脚本在不同环境可能一半生效一半静默失败。










