当前位置:首页>Linux>老王linux-异常排查思路-java启动失败、卡顿、占用过高、意外退出等处理

老王linux-异常排查思路-java启动失败、卡顿、占用过高、意外退出等处理

  • 2026-09-07 02:33:09
老王linux-异常排查思路-java启动失败、卡顿、占用过高、意外退出等处理

场景1:Java进程启动失败,无任何进程信息

常见原因:启动命令错误、配置文件有误、权限不足、JDK 环境异常。

排查步骤:

  1. 检查 JDK 环境是否正常:   

    java -version  # 查看JDK版本,确认是否安装、配置正确echo $JAVA_HOME  # 确认JDK环境变量配置

    若提示“command not found”:说明 JDK 未安装,或环境变量未配置,需先安装 JDK 并配置 JAVA_HOME。

  2. 检查启动命令是否正确:        

    错误示例:java 文件名(缺少 -jar 或主类);

    正确示例:java -jar xxx.jar 或 java -cp xxx.jar 主类名。

  3. 检查文件权限:      

     # 查看jar包/启动脚本权限ls -l xxx.jar# 若权限不足,赋予执行权限chmod +x xxx.jar 或 chmod 755 xxx.jar
  4. 查看启动日志(关键,定位具体错误):  

     # 启动时添加日志输出,定位错误原因java -jar xxx.jar > startup.log 2>&1# 查看错误信息cat startup.log

通过日志可快速定位:配置错误、依赖缺失等具体问题。

场景2:Java进程存在,但服务无法访问(端口不通)

常见原因:端口被占用、防火墙拦截、服务未监听指定端口、配置文件错误。

排查步骤:

  1. 检查进程监听的端口:

    # 查看PID监听的端口(替换PID)netstat -anp | grep PID# 或ss -tulnp | grep PID

若输出为空:说明服务未正常监听端口,需检查服务配置文件(如端口配置错误)。

  1. 检查端口是否被占用:  

     # 替换PORT为服务端口(如8080)netstat -anp | grep PORT# 若有其他进程占用,杀死占用进程或更换服务端口kill -9 占用PID
  2. 检查防火墙是否拦截端口:       

    # 查看防火墙开放端口firewall-cmd --list-ports# 若端口未开放,添加开放规则(替换PORT)firewall-cmd --add-port=PORT/tcp --permanentfirewall-cmd --reload

场景3:Java进程占用CPU/内存过高(服务器卡顿)

常见原因:代码死循环、内存泄漏、JVM参数配置不合理。

排查步骤:

  1. 查看进程资源占用:     

     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)、启动脚本异常、服务崩溃。

排查步骤:

  1. 查看系统日志,确认是否被系统杀死:     

    # 查看系统日志,筛选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进程存在,但日志无输出、服务无响应

常见原因:服务启动成功但未初始化、配置文件错误、依赖服务未启动。

排查步骤:

  1. 查看服务启动日志,确认是否有初始化失败信息;

  2. 检查服务配置文件(如数据库连接、端口配置),是否有配置错误导致服务无法正常初始化;

  3. 检查服务依赖(如数据库、缓存)是否正常运行,若依赖异常,Java服务会启动但无响应。

最新文章

随机文章