VSCode 启动 Spring Boot 微服务 JMX 端口冲突问题(最终解决)

一、问题现象

使用 Visual Studio Code 启动多个微服务时,报错:

java.rmi.server.ExportException: Port already in use
Caused by: java.net.BindException: Address already in use

即使使用 netstat 也查不到端口占用。


二、根本原因

问题并不在 Spring Boot,而在 JMX(Java 管理接口)

  • JMX 基于 RMI(远程调用)

  • 实际使用 两个端口

    1. jmxremote.port(注册端口)
    2. jmxremote.rmi.port(通信端口)

👉 如果只配置了一个端口:

-Dcom.sun.management.jmxremote.port=52053

那么:

  • 第二个端口会 随机分配
  • 多服务启动时仍然可能冲突

三、正确解决方案(在 launch.json 中配置)

👉 必须在 launch.jsonvmArgs 中同时固定两个端口

标准写法:

"vmArgs": "-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=61010 \
-Dcom.sun.management.jmxremote.rmi.port=61010 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=127.0.0.1"

四、多个微服务配置示例

每个服务使用不同端口,例如:

{
  "configurations": [
    {
      "name": "gateway",
      "vmArgs": "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=61010 -Dcom.sun.management.jmxremote.rmi.port=61010 ..."
    },
    {
      "name": "auth",
      "vmArgs": "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=61011 -Dcom.sun.management.jmxremote.rmi.port=61011 ..."
    },
    {
      "name": "flowable",
      "vmArgs": "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=61012 -Dcom.sun.management.jmxremote.rmi.port=61012 ..."
    }
  ]
}

五、仍然报错的原因

即使配置正确,仍可能出现:

  • JVM 端口未及时释放(TIME_WAIT)
  • JMX 残留导致“假占用”

六、最终解决办法

✅ 1. 更换一组新端口(最有效)

61010 / 61011 / 61012

避免使用已经报错的端口(如 52053)。


✅ 2. 清理 Java 进程

taskkill /F /IM java.exe

✅ 3. 重启系统(兜底)

彻底释放端口资源。


七、总结

JMX 冲突 = 双端口机制 + 端口未释放

最终解决方案:

✅ 在 launch.json 中配置 port + rmi.port
✅ 每个服务使用不同端口
✅ 避免使用已冲突端口

即可彻底解决问题。


Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐