温馨提示×

怎么定位CentOS Java异常

小樊
52
2026-08-04 06:00:56
栏目: 编程语言

在 CentOS 上定位 Java 异常,通常要从“异常现象 → 日志 → 进程 → JVM → 系统资源”逐层排查。下面给你一套常用且实战有效的定位思路


一、先明确“异常”是什么

先区分是哪种异常,定位方向不同:

异常类型 常见表现
Java 业务异常 接口报错、日志中 Exception
JVM 崩溃 hs_err_pid*.log
进程假死 端口通但无响应
CPU 打满 load 高
OOM OutOfMemoryError
启动失败 起不来、自动退出

二、第一步:看 Java 日志(最重要)

90% 的问题在日志里

1️⃣ 应用日志

常见位置:

/var/log
/app/logs
/opt/*/logs

搜索异常:

grep -R "Exception" /app/logs
grep -R "ERROR" /app/logs

重点看:

  • Caused by
  • OutOfMemoryError
  • NullPointerException
  • SocketTimeoutException

2️⃣ Systemd / 服务日志

如果用 systemd:

journalctl -u your-service-name -n 200

3️⃣ 启动失败

java -jar xxx.jar

直接看控制台输出。


三、判断 Java 进程是否正常

1️⃣ 查看进程

jps -l
ps -ef | grep java

2️⃣ 进程是否假死

  • 端口是否监听:
netstat -tunlp | grep 8080
ss -lntp
  • 接口是否响应:
curl http://localhost:8080

四、CPU / 内存异常定位(高频)

1️⃣ 查看 CPU 占用

top

找到 CPU 高的 Java PID。

2️⃣ 定位线程

top -Hp <pid>

记录线程 ID(十进制)
转成十六进制:

printf "%x\n" 线程ID

3️⃣ 打线程栈

jstack <pid> > stack.txt

stack.txt 中搜索十六进制线程 ID,看卡在哪里。

✅ 常用于:

  • 死循环
  • 死锁
  • 阻塞

五、OOM(内存溢出)定位

1️⃣ 是否 OOM

日志中搜索:

grep -i "OutOfMemory" app.log

2️⃣ JVM 崩溃日志

ls -lh hs_err_pid*.log

3️⃣ 查看内存使用

jmap -heap <pid>

4️⃣ 生成内存快照(谨慎)

jmap -dump:live,format=b,file=heap.hprof <pid>

用工具分析:

  • Eclipse MAT
  • VisualVM

六、JVM 运行状态分析

1️⃣ GC 是否异常

jstat -gc <pid> 1000 5

关注:

  • FGCT / FGCC(Full GC)
  • O 区是否接近 100%

2️⃣ JVM 参数

ps -ef | grep java

重点看:

  • -Xms -Xmx
  • -XX:+HeapDumpOnOutOfMemoryError
  • -XX:HeapDumpPath

七、系统层面问题(CentOS)

1️⃣ 内存是否不足

free -h

2️⃣ 磁盘是否满

df -h

3️⃣ 文件句柄耗尽

ulimit -n
lsof -p <pid> | wc -l

八、典型问题速查表

现象 优先命令
接口报错 看应用日志
CPU 高 top → jstack
OOM jmap / hs_err
启动失败 journalctl / 控制台
假死 jstack
卡顿 jstat -gc

九、建议你补充的信息(我可以更精确帮你)

你可以直接贴出来:

  1. 异常日志片段
  2. Java 版本:java -version
  3. 是否用 systemd / Docker
  4. 是 CPU、内存、假死还是启动失败

我可以直接帮你分析具体异常原因

0