CentOS上Java日志中的错误码主要分为两类:一类是JVM致命错误码(如信号编号、EXCEPTION_),通常出现在**hs_err_pid.log崩溃日志中;另一类是Java异常类名**(如NullPointerException、OutOfMemoryError),通常出现在应用或容器的日志中(如catalina.out、application.log)。下面给出对照与定位方法。
常见JVM致命错误码与含义
- SIGSEGV (0xb):段错误,非法内存访问。常见于JNI/本地库问题、内存损坏或错误的指针操作。若“Problematic frame”指向libjvm.so,可能是JVM缺陷;若指向第三方**.so**,多为本地代码问题。
- SIGBUS (0xa):总线错误,典型为未对齐访问或访问已截断映射文件导致。
- EXCEPTION_ACCESS_VIOLATION:Windows平台常见,等价于访问违规的内存访问。
- EXCEPTION_STACK_OVERFLOW:栈溢出,常见于深度递归或线程栈设置过小。
- 日志关键字段:pid/tid(进程/线程ID)、pc(程序计数器)、Problematic frame(问题帧,指示崩溃位置在Java/本地/JVM哪一层)。
- 示例线索:
- “Problematic frame: V [libjvm.so+…]” → 可能在JVM内部;
- “Problematic frame: C [libxxx.so+…]” → 可能在本地库;
- “si_code: 1 (BUS_ADRALN)” → SIGBUS的未对齐访问。
以上信号与字段在hs_err_pid.log头部与线程信息段均有体现。
常见Java异常类名与含义
- NullPointerException:访问了null对象。
- ArrayIndexOutOfBoundsException:数组下标越界。
- ClassNotFoundException:找不到指定类(类路径/依赖问题)。
- SQLException:数据库访问错误(连接、语法、权限等)。
- ArithmeticException:算术异常(如除以零)。
- OutOfMemoryError:JVM无法分配更多内存(堆/元空间/直接内存不足)。
- FileNotFoundException:文件未找到。
- 异常体系要点:Error(如OutOfMemoryError、StackOverflowError)通常为致命错误,应用一般不应捕获;Exception分为受检异常(如IOException、SQLException)与运行时异常(如NPE、ArrayIndexOutOfBoundsException)。
以上异常类型与应用日志中常见输出一致,命名即含义明确。
如何快速定位与应对
- 先判断日志类型:
- 出现“A fatal error has been detected”与“Problematic frame” → 打开同目录的hs_err_pid.log;
- 应用持续打印“Exception/ERROR” → 查看应用或容器日志(如catalina.out、application.log)。
- 定位步骤:
- 在hs_err_pid*.log中确认信号类型(如SIGSEGV/SIGBUS)、pc、Problematic frame,判断是JVM、第三方本地库还是应用代码问题;必要时结合core dump与gdb分析。
- 若是应用异常,依据异常类名直指代码缺陷(如空指针、越界、资源未找到等),并结合日志上下文修复。
- 若怀疑系统侧问题,检查**/var/log/messages与abrt**(CentOS错误报告工具)是否收集到崩溃信息,以辅助定位内核/资源/ABRT配置问题。
- 常用命令与配置:
- 查看Java进程与日志路径:
ps -ef | grep java;
- 指定崩溃日志路径:
-XX:ErrorFile=/var/log/hs_err_pid<pid>.log;
- 检查系统日志:
tail -n 200 /var/log/messages | grep -i abrt。
以上流程与命令可快速从“错误码/异常名”定位到“问题位置与修复方向”。