常見場景
- 啟動 Tomcat/服務報錯:
Address already in use: JVM_Bind
- 微服務啟動衝突、Docker 端口映射失敗
- 開發工具熱部署失敗、舊進程未正確釋放端口
快速定位佔用進程
Windows
# 查看特定端口佔用
netstat -ano | findstr :8080
# 顯示 PID 對應進程名
tasklist | findstr
# 強制結束進程
taskkill /PID /F
Linux / macOS
# 查看端口佔用 (需 root 權限看所有進程)
sudo netstat -tulpn | grep :8080
# 或
sudo lsof -i :8080
# 或
ss -tulpn | grep :8080
# 終止進程
kill -9
常見端口衝突對照表
| 端口 | 常見服務 | 衝突典型場景 |
| 80/443 | HTTP/HTTPS | Nginx、Apache、IIS、System 進程 |
| 3306 | MySQL | 多實例、Docker 映射衝突 |
| 5432 | PostgreSQL | 本地安裝與容器共存 |
| 6379 | Redis | 多叢集、哨兵模式 |
| 8080 | Tomcat/Jetty | 多專案並行、IDE 熱部署殘留 |
| 9000 | PHP-FPM/SonarQube | 服務重疊 |
| 27017 | MongoDB | 副本集多節點本地模擬 |
| 9200/9300 | Elasticsearch | 叢集節點通訊端口 |
預防與最佳實踐
- 配置檔統一管理:專案端口集中在
application.yml/.env,避免硬編碼
- 開發環境動態端口:Spring Boot
server.port=0 隨機分配,或用 PortOffset 機制
- Docker 端口隔離:容器內部端口固定,宿主機映射動態分配(
-p 0:8080)
- 優雅關閉:實作
ShutdownHook、@PreDestroy 確保釋放端口
- 進程管理工具:使用
systemd、Supervisor、PM2 管理服務生命週期
進階排查:TIME_WAIT 狀態大量佔用
# 查看 TIME_WAIT 連線數
netstat -an | grep TIME_WAIT | wc -l
# Linux 核心參數調優 (/etc/sysctl.conf)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 套用
sysctl -p
