服务启动的时候加上Java参数
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999
这个Java启动参数 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999
是用于启用 Java调试协议(JDWP) 的,允许调试器(如IntelliJ IDEA、Eclipse等)附加到正在运行的JVM进程上进行远程调试。以下是参数的详细解释:
参数分解
-agentlib:jdwp
- 表示加载JVM的本地代理库
jdwp
(Java Debug Wire Protocol),用于支持调试功能。
- 表示加载JVM的本地代理库
transport=dt_socket
- 指定调试器与JVM之间的通信方式为 Socket连接 (默认端口可通过
address
指定)。 - 其他可选值:
dt_shmem
(仅Windows,共享内存通信)。
- 指定调试器与JVM之间的通信方式为 Socket连接 (默认端口可通过
server=y
- 表示当前JVM作为调试服务器,等待调试器主动连接(
y
=yes)。 - 如果设为
n
,则JVM会尝试以客户端模式连接调试器(较少用)。
- 表示当前JVM作为调试服务器,等待调试器主动连接(
suspend=n
- 是否在启动时暂停JVM,等待调试器连接后再继续执行:
y
:暂停(适合调试启动问题)。n
:不暂停,直接运行(适合调试运行中的代码)。
- 是否在启动时暂停JVM,等待调试器连接后再继续执行:
address=9999
- 指定调试监听的端口号(这里是
9999
)。调试器需要配置相同的端口才能连接。 - 可以是具体端口(如
9999
),或*
(随机端口,但需通过其他方式获取实际端口)。
- 指定调试监听的端口号(这里是
典型使用场景
- 远程调试
- 启动Java应用时添加此参数,然后在IDE中配置远程调试,连接到目标JVM的
9999
端口。
- 启动Java应用时添加此参数,然后在IDE中配置远程调试,连接到目标JVM的
- 本地调试
- 即使本地运行,也可以通过此参数启用调试,再通过IDE附加到进程。
示例命令
bash
|---------------------------------------------------------------------------------------------|
| java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999 -jar your_app.jar
|
注意事项
- 安全性
- 调试端口会暴露JVM内部信息,不要在生产环境使用,或通过防火墙限制访问IP。
- 端口冲突
- 如果
9999
被占用,可更换为其他端口(如5005
)。
- 如果
- 性能影响
- 调试模式会略微降低运行速度,但通常可忽略。
- 与
-Xdebug
的区别- 旧版JVM可能使用
-Xdebug -Xrunjdwp:...
,但-agentlib:jdwp
是更现代的写法。
- 旧版JVM可能使用
IDE配置示例(IntelliJ IDEA)
- 点击 Run → Edit Configurations。
- 选择 + → Remote JVM Debug。
- 填写
Host
(目标机器IP)和Port
(如9999
)。 - 启动Java应用后,在IDE中点击调试按钮即可连接。
总结
这个参数的作用是:
"在JVM的9999端口上启动一个调试服务器,允许调试器通过Socket连接,且JVM启动后不暂停等待调试器。"
常用于开发或测试环境中诊断问题,但需避免在生产环境使用。