You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot开启debug模式后停止应用,5005端口未释放问题咨询

问题原因分析

结合你使用的Windows 10+Cygwin64环境,这个端口未释放的问题主要和以下几点有关:

  • Cygwin的信号处理差异:在Linux系统里,Ctrl + C会给进程发送SIGINT信号,JVM收到后会触发优雅关闭流程,释放所有资源(包括debug端口)。但Cygwin是在Windows上模拟Linux环境,它发送的SIGINT信号可能无法被JVM正确识别和处理,导致JVM没有彻底终止,debug agent的线程还占用着5005端口。
  • 残留的Windows进程:有时候在Cygwin里执行Ctrl + C后,Cygwin的shell可能认为进程已经停止,但实际上对应的Windows Java进程还在后台运行,没有被完全杀死,端口自然不会释放。
  • Spring Boot关闭钩子未触发:如果JVM没有收到有效的终止信号,Spring Boot内置的关闭钩子(负责清理资源、关闭上下文)就不会执行,导致端口等资源一直被占用。
具体解决办法

临时应急方案(快速释放端口)

每次遇到端口占用时,直接找到并杀死残留进程:

  1. 在Cygwin终端里执行:
    netstat -ano | grep 5005
    
    找到占用端口的进程PID(最后一列数字)。
  2. 执行强制杀死命令:
    taskkill /F /PID <找到的PID>
    
    或者直接在Windows的命令提示符/PowerShell里执行上面的步骤,结果更准确。

根源解决方法

  1. 改用Windows原生终端启动应用
    放弃Cygwin终端,直接用Windows的命令提示符(cmd)或者PowerShell运行你的Maven debug命令:

    mvn -P dev spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
    

    Windows原生终端的Ctrl + C能正确给JVM发送终止信号,确保JVM彻底关闭并释放端口。

  2. 在Cygwin里用kill命令终止进程
    不要用Ctrl + C,而是先找到Java进程的PID:

    ps -ef | grep java
    

    然后先尝试优雅终止:

    kill <PID>
    

    如果进程没退出,再强制杀死:

    kill -9 <PID>
    

    这种方式能确保Cygwin正确通知JVM终止,避免残留进程。

  3. 检查应用内的非守护线程
    确认你的Spring Boot应用里有没有运行的非守护线程(比如自定义的后台任务线程),如果有的话,需要在应用关闭时手动停止这些线程,否则JVM会因为非守护线程未结束而无法退出。可以在@PreDestroy注解的方法里添加线程停止逻辑,或者注册自定义的Shutdown钩子。

内容的提问来源于stack exchange,提问作者Dherik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:07:54