场景1:Java进程启动失败,无任何进程信息
常见原因:启动命令错误、配置文件有误、权限不足、JDK 环境异常。
排查步骤:
检查 JDK 环境是否正常:
java -version # 查看JDK版本,确认是否安装、配置正确echo $JAVA_HOME # 确认JDK环境变量配置
若提示“command not found”:说明 JDK 未安装,或环境变量未配置,需先安装 JDK 并配置 JAVA_HOME。
检查启动命令是否正确:
错误示例:java 文件名(缺少 -jar 或主类);
正确示例:java -jar xxx.jar 或 java -cp xxx.jar 主类名。
检查文件权限:
# 查看jar包/启动脚本权限ls -l xxx.jar# 若权限不足,赋予执行权限chmod +x xxx.jar 或 chmod 755 xxx.jar
查看启动日志(关键,定位具体错误):
# 启动时添加日志输出,定位错误原因java -jar xxx.jar > startup.log 2>&1# 查看错误信息cat startup.log
通过日志可快速定位:配置错误、依赖缺失等具体问题。
场景2:Java进程存在,但服务无法访问(端口不通)
常见原因:端口被占用、防火墙拦截、服务未监听指定端口、配置文件错误。
排查步骤:
检查进程监听的端口:
# 查看PID监听的端口(替换PID)netstat -anp | grep PID# 或ss -tulnp | grep PID
若输出为空:说明服务未正常监听端口,需检查服务配置文件(如端口配置错误)。
检查端口是否被占用:
# 替换PORT为服务端口(如8080)netstat -anp | grep PORT# 若有其他进程占用,杀死占用进程或更换服务端口kill -9 占用PID
检查防火墙是否拦截端口:
# 查看防火墙开放端口firewall-cmd --list-ports# 若端口未开放,添加开放规则(替换PORT)firewall-cmd --add-port=PORT/tcp --permanentfirewall-cmd --reload
场景3:Java进程占用CPU/内存过高(服务器卡顿)
常见原因:代码死循环、内存泄漏、JVM参数配置不合理。
排查步骤:
查看进程资源占用:
top # 按P查看CPU排序,按M查看内存排序,找到Java进程PID# 或精准查看Java进程占用ps -aux | grep java | grep -v grep
若 CPU 占用持续 90%+,大概率是代码死循环;若内存占用持续升高,大概率是内存泄漏。
2. 分析CPU过高原因:
# 查看Java进程中占用CPU最高的线程(替换PID)top -H -p PID# 记录占用最高的线程ID(TID),转换为16进制(替换TID)printf "%x\n" TID# 查看该线程对应的代码(替换PID和16进制TID)jstack PID | grep 16进制TID -A 20
通过 jstack 输出,定位到具体的代码行(如死循环、频繁GC的线程)。
3. 分析内存过高原因:
# 导出Java堆内存快照(替换PID和输出路径)jmap -dump:format=b,file=/tmp/java_heap.hprof PID# 用JVisualVM或MAT工具分析快照,定位内存泄漏点
优化建议:调整 JVM 参数(如 -Xms、-Xmx),避免内存分配过大或过小。
场景4:Java进程意外退出(无报错,进程消失)
常见原因:内存溢出(OOM)、系统杀死进程(OOM Killer)、启动脚本异常、服务崩溃。
排查步骤:
查看系统日志,确认是否被系统杀死:
# 查看系统日志,筛选Java相关记录grep -i java /var/log/messages# 或查看OOM Killer记录dmesg | grep -i kill
若出现“Out of memory: Kill process”,说明系统内存不足,杀死了Java进程,需扩容内存或优化JVM参数。
2.查看Java崩溃日志: Java进程崩溃时,会自动生成 hs_err_pidXXX.log 文件(通常在启动目录或 /tmp 下),打开该文件,可直接看到崩溃原因(如内存溢出、依赖缺失)。
3. 检查启动脚本:确认脚本中是否有异常退出逻辑,或启动命令是否完整。
场景5:Java进程存在,但日志无输出、服务无响应
常见原因:服务启动成功但未初始化、配置文件错误、依赖服务未启动。
排查步骤:
查看服务启动日志,确认是否有初始化失败信息;
检查服务配置文件(如数据库连接、端口配置),是否有配置错误导致服务无法正常初始化;
检查服务依赖(如数据库、缓存)是否正常运行,若依赖异常,Java服务会启动但无响应。