现象
Tomcat运行过程中出现崩溃现象,所幸服务器监控程序自动对其执行了重新启动,因此对生成环境没有造成太久的服务中断。
崩溃问题首次出现,考虑为偶然情况。然而在几日之内,Tomcat再次崩溃,因此需要调查具体崩溃原因,初步考虑后,推测是由于Tomcat运行所占内存过大,因此被系统kill,准备升级服务器。
排查
1. Tomcat内存占用过大,被系统kill。
假设是系统所为,一般会有系统日志:
cat /var/log/messages
查看后没有发现kill、mem相关日志。
2. Jvm遇到致命错误崩溃。
如果Jvm遇到致命错误而崩溃,应当会在程序目录生成hs_err_pid.log等错误报告文件:
ll tomcat/bin
查看后没有找到崩溃日志。
3. Tomcat遇到错误崩溃。
直接查看Tomcat日志:
cat tomcat/logs/catalina.out
日志量非常大,经过拆分后,定位到崩溃日期附件,终于找到蛛丝马迹:
2022-06-14 08:29:14,121 [ERROR] ControllerHelper:139 - readValue error: {g:
*** Error in `//bin/java': malloc(): memory corruption: 0x00007fb4440a1de0 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x82aa6)[0x7fb50ef30aa6]
/lib64/libc.so.6(__libc_malloc+0x4c)[0x7fb50ef336fc]
/usr/lib64/libse.so(Java_com_s_Se_d+0x142)[0x7fb39abb1cec]
[0x7fb4fa7206c7]
======= Memory map: ========
00400000-00401000 r-xp 00000000 fd:01 1307450 /usr/java/jdk1.8.0_131/jre/bin/java
00600000-00601000 rw-p 00000000 fd:01 1307450 /usr/java/jdk1.8.0_131/jre/bin/java
00828000-009c9000 rw-p 00000000 00:00 0 [heap]
6c7c00000-708a00000 rw-p 00000000 00:00 0
708a00000-76d400000 ---p 00000000 00:00 0
76d400000-783080000 rw-p 00000000 00:00 0
783080000-7c0000000 ---p 00000000 00:00 0
7c0000000-7c1580000 rw-p 00000000 00:00 0
7c1580000-800000000 ---p 00000000 00:00 0
7fb32db7e000-7fb32db81000 ---p 00000000 00:00 0
7fb32db81000-7fb32dc7f000 rw-p 00000000 00:00 0
7fb32dc7f000-7fb32dc82000 ---p 00000000 00:00 0
由此可见,Tomcat在运行过程中,底层代码库(so文件)遇到了内存错误,从而导致Tomcat崩溃,具体而言,出错的库文件如下:
usr/lib64/libse.so(Java_com_s_Se_d+0x142)[0x7fb39abb1cec]
即libse.so库文件存在问题,该库文件非系统自带,为业务底层代码库,因此修复之即可。