记一次Tomcat 端口被占解决思路及流程
大家好,今天分享一个最近工作中遇到的、差点让我把键盘砸了的奇葩问题。希望我的血泪史能帮你省点头发。
一、案发现场:诡异的端口占用
故事是这样的:我最近正在用 IDEA 启动一个 Tomcat 项目,一切正常。突然手贱,在项目启动到一半的时候,直接把服务给停了。
然后…噩梦开始了。
我再次点击 Debug 启动,IDEA 直接甩给我一个大红脸:

Address already in use: bind!
端口 50835 被占用了!
奇怪的是,如果我用 Run 模式启动,就一切正常。只有 Debug 模式不行。
附上我的 Tomcat 配置,大家可以看下,JMX 和 Debug 端口都是设置好的:


二、常规破案:三板斧全部失效
遇到端口占用,老司机的第一反应当然是祭出祖传三板斧:
第一斧:netstat 精准查找 + taskkill 强力击杀
# 查一下 50835 端口到底被哪个孙子占了
netstat -ano | findstr "50835"
结果……

好家伙,干净得像我月底的钱包! 根本没有任何进程占用这个端口。
第二斧:暴力清场,干掉所有 java.exe
我想,会不会是哪个 java 进程僵死了没显示出来?行,打开任务管理器,详细信息页签,找到所有 java.exe,挨个“结束任务”!

清场完毕,再次 Debug!结果,熟悉的红色错误又跳了出来。
我人傻了。端口明明没被占用,但系统就是说它被占用了。这难道是遇见“端口幽灵”了?
三、柳暗花明:揪出第一个嫌疑人
在抓狂了半天后,我开始冷静地回忆:我最近在电脑上装了啥新东西?毕竟之前一直好好的。
电光火石间,我想到了它——WSL2!
题外话:WSL2 是啥?
简单说,就是微软官方出的一个神器,让你能在 Windows 里流畅地跑一个真·Linux 系统,开发必备!
当时安装 WSL2 的时候,我手痒,在“启用或关闭 Windows 功能”里,除了 适用于 Linux 的 Windows 子系统,还顺手勾选了 Hyper-V。

再提一嘴:Hyper-V 又是个啥?
它是微软亲儿子的虚拟机软件,跟 VMware、VirtualBox 是一类东西。
那这货跟端口占用有啥关系?
这就要说到它霸道的运行机制了。我这里打个比喻解释下:
你的电脑是家大酒店,端口 0-65535 就是酒店的所有房间。 你启动的程序(比如 IDEA)是散客,想住 50835 号房。 而
Hyper-V/WSL2/Docker 这类虚拟化工具,就是个超级旅行团。酒店经理(Windows 系统)知道这个旅行团随时可能要用掉几十上百个房间,但又不确定具体是哪些。为了省事,经理干脆直接划出一整层楼(比如50000 到 51000 号房),挂上“团队预留,请勿打扰”的牌子。
这时,你这个散客(IDEA)跑来想住 50835 房,前台(系统)看了一眼:“抱歉,这间房被预留了,不可用!”
你很纳闷:“可我去看过了,里面明明没人啊!”(就像 netstat 查不到一样)。
但事实就是,房间确实不能用,因为它属于“预留区”,等着那个大旅行团随时入住。
恍然大悟!我打开“启用或关闭 Windows 功能”,取消勾选 Hyper-V,重启电脑。
再次启动项目,成功!
四、又来报错!
我天真地以为战斗到此结束。
结果,两天后,在我又一次项目启动途中又停掉 Tomcat 后,那个熟悉的红色错误,带着嘲讽的微笑,又双叒叕地跳了出来!
我彻底懵了。Hyper-V 不是已经被我关了吗?怎么还来?!
继续查资料,才找到原因:
在 Windows 系统里,Hyper-V
只是“虚拟化技术”这个黑帮家族的其中一个成员。你把它关了,但只要它的兄弟们还在活动,背后的大佬(底层虚拟化平台)就依然会去“预留端口”!这个黑帮家族的成员包括:
WSL2 (Windows Subsystem for Linux 2):头号元凶!
虚拟机平台 (Virtual Machine Platform):WSL2 的基础,关了它 WSL2 就用不了。 Windows 虚拟机监控程序平台 Windows Sandbox
(沙盒) Docker Desktop for Windows:这货开机自启,是 WSL2 的好基友,它一启动就会自动唤醒 WSL2。
终于知道原因了, 我虽然关了 Hyper-V 的管理勾选项,但因为我电脑上还装着 Docker Desktop,并且它是开机自启的!只要 Docker 一启动,就会拉起 WSL2,然后 Windows 底层就会预留一大片端口。
五、终极解决方案:打不过就加入
既然躲不过,那就只能正面刚了:
-
以 管理员身份 打开 CMD 或 PowerShell。(切记,是管理员!)
-
输入以下命令,查看系统到底为你“预留”了哪些TCP端口范围:
netsh interface ipv4 show excludedportrange protocol=tcp
回车后,我看到了这样一串列表:

注意看最后一行:50790 - 50889。
而我那 Debug 端口 50835,不多不少,正好在这个预留端口范围里!
最终解决方法:
回到 IDEA 的 Tomcat 配置里,把 Debug 端口从 50835 改成一个不在任何预留范围内的端口号,比如 58888。
保存,启动,绿条飞起,项目成功运行!世界终于清净了!
总结一下 (太长不看版)
如果你也遇到了 IDEA (或其他程序) 端口被占用,但 netstat 又查不到进程的情况,
按以下步骤操作:
**1. 以 管理员 身份打开 CMD,输入
netsh interface ipv4 show excludedportrange protocol=tcp
- 查看输出的端口范围列表,确认你的端口号是不是掉进这些范围里了。
- 如果是,别犹豫,换个端口号!换一个不在这些范围里的端口,问题立马解决。**
这通常是由于你开启了 WSL2 / Docker / Hyper-V 等虚拟化功能导致的。
希望这篇血泪史能帮你快速定位问题,少走弯路!如果对你有帮助,点个赞不过分吧?(手动滑稽)
806

被折叠的 条评论
为什么被折叠?



