Java远程调试核心是启用JDWP代理,必须使用-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005参数,并配套开放防火墙端口、IDE配置Remote Debug、确保本地代码与远程class严格一致。

Java 程序开启远程调试,核心是通过 JVM 启动参数启用 JDWP(Java Debug Wire Protocol)调试代理。关键不是加任意参数,而是用对 -agentlib:jdwp 或兼容的旧式 -Xdebug -Xrunjdwp,并确保网络可达、端口开放、代码一致。
必须添加的 JVM 参数格式
推荐使用标准、通用、现代的写法:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
各部分含义清晰:
- transport=dt_socket:使用 TCP socket 通信(唯一常用选项)
- server=y:表示当前 JVM 作为调试服务端,等待 IDE 连接
-
suspend=n:启动后立即运行,不卡在“等待调试器”状态(设为
y会阻塞,仅适合极少数需首行断点场景) -
address=*:5005:监听所有网卡的 5005 端口;⚠️ 注意 若写成
127.0.0.1:5005,则仅本地可连,远程 IDE 无法访问
实际启动命令示例
以 Spring Boot jar 包为例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar myapp.jar- 若用脚本部署(如 systemd、shell 启动脚本),把该参数加到
java命令开头,紧挨java关键字 - 旧版 JDK(如 Java 7/8)可能支持
-Xdebug -Xrunjdwp:...,但已废弃,建议统一用-agentlib写法
配套必须做的三件事
光加参数不够,缺一不可:
-
开放服务器防火墙端口:确认 5005(或你选的端口)在远程服务器上对外可访问(如
ufw allow 5005或云平台安全组放行) -
本地 IDE 配置 Remote JVM Debug:在 IntelliJ IDEA 或 Eclipse 中新建 Remote 调试配置,填入服务器 IP 和对应端口(如
192.168.1.100:5005) - 本地代码与远程 class 严格匹配:IDE 中打开的源码版本必须和 jar 包编译自同一份代码,否则断点失效、变量显示异常
常见问题快速排查
连不上?优先检查这几项:
- 用
netstat -tuln | grep 5005或ss -tuln | grep 5005确认 JVM 确实监听了*:5005(不是127.0.0.1:5005) - 从本地执行
telnet your-server-ip 5005,看是否能通(不通说明网络或防火墙拦截) - IDE 启动 Remote Debug 时,控制台是否提示 “Connected to the target VM” —— 成功标志
- 避免在生产环境长期开启;调试完及时移除参数并重启服务

















