在 CentOS 上定位 Java 异常,通常要从“异常现象 → 日志 → 进程 → JVM → 系统资源”逐层排查。下面给你一套常用且实战有效的定位思路。
先区分是哪种异常,定位方向不同:
| 异常类型 | 常见表现 |
|---|---|
| Java 业务异常 | 接口报错、日志中 Exception |
| JVM 崩溃 | hs_err_pid*.log |
| 进程假死 | 端口通但无响应 |
| CPU 打满 | load 高 |
| OOM | OutOfMemoryError |
| 启动失败 | 起不来、自动退出 |
90% 的问题在日志里
常见位置:
/var/log
/app/logs
/opt/*/logs
搜索异常:
grep -R "Exception" /app/logs
grep -R "ERROR" /app/logs
重点看:
Caused byOutOfMemoryErrorNullPointerExceptionSocketTimeoutException如果用 systemd:
journalctl -u your-service-name -n 200
java -jar xxx.jar
直接看控制台输出。
jps -l
ps -ef | grep java
netstat -tunlp | grep 8080
ss -lntp
curl http://localhost:8080
top
找到 CPU 高的 Java PID。
top -Hp <pid>
记录线程 ID(十进制)
转成十六进制:
printf "%x\n" 线程ID
jstack <pid> > stack.txt
在 stack.txt 中搜索十六进制线程 ID,看卡在哪里。
✅ 常用于:
日志中搜索:
grep -i "OutOfMemory" app.log
ls -lh hs_err_pid*.log
jmap -heap <pid>
jmap -dump:live,format=b,file=heap.hprof <pid>
用工具分析:
jstat -gc <pid> 1000 5
关注:
ps -ef | grep java
重点看:
-Xms -Xmx-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPathfree -h
df -h
ulimit -n
lsof -p <pid> | wc -l
| 现象 | 优先命令 |
|---|---|
| 接口报错 | 看应用日志 |
| CPU 高 | top → jstack |
| OOM | jmap / hs_err |
| 启动失败 | journalctl / 控制台 |
| 假死 | jstack |
| 卡顿 | jstat -gc |
你可以直接贴出来:
java -version我可以直接帮你分析具体异常原因。