温馨提示×

centos为何java端口被占

小樊
41
2026-10-05 16:47:18
栏目: 编程语言

在 CentOS 上 Java 端口被占用(Address already in use) 是非常常见的问题,通常不是 Java 本身的问题,而是 系统/进程/配置 导致的。下面按最常见原因 → 排查方法 → 解决办法说明。


一、最常见原因

1️⃣ 上一个 Java 进程没真正退出

  • 你以为关了,其实:
    • 后台进程还在(nohup / &)
    • 线程没退出(如线程池、非守护线程)
    • kill -9 没执行或执行错 PID

✅ 表现:

java.net.BindException: Address already in use

2️⃣ 端口被其他 Java 进程占用

  • 多次启动同一服务
  • 测试环境 / 生产环境混淆

3️⃣ 端口被非 Java 进程占用

例如:

  • Nginx
  • Docker
  • 其他中间件(Redis、Kafka)

4️⃣ TIME_WAIT 状态导致(少见但存在)

  • 刚停掉服务马上重启
  • 端口处于 TIME_WAIT

5️⃣ Docker / 容器端口映射冲突

  • 宿主机端口已被容器占用
  • 或容器内部端口冲突

二、快速排查方法(必须会)

✅ 1. 查端口被谁占用(最常用)

ss -lntp | grep 8080
# 或
netstat -lntp | grep 8080

示例输出:

LISTEN 0 100 0.0.0.0:8080 0.0.0.0:* users:(("java",pid=12345,fd=45))

➡️ 说明被 PID 12345 的 java 进程 占用


✅ 2. 看具体进程信息

ps -ef | grep 12345

或:

jps -l

✅ 3. 杀掉占用进程(谨慎)

kill -9 12345

✅ 4. 查所有 Java 进程

jps -l

或:

ps -ef | grep java

三、Docker 场景专用

查容器占用端口

docker ps
docker port 容器名

释放端口

docker stop 容器名
docker rm 容器名

四、避免再次被占的建议

✅ 启动前检查端口
✅ 使用脚本统一管理启动/停止
✅ 不要用 kill -9 作为常规手段
✅ 服务加健康检查 + 优雅停机
✅ 不同环境使用不同端口


五、如果你是这些情况,可以直接告诉我

你可以补充:

  • 端口号(如 8080 / 9090)
  • 是不是 Docker
  • 报错完整日志
  • CentOS 版本(cat /etc/redhat-release)

我可以精准帮你定位是哪一类问题。

0 踩