信创环境麒麟系统Ky10运行openjdk,进程频繁崩溃该如何解决?
a系统内核:4.19.90-25.19.v2101.ky10.aarch64
java版本:OpenJDK Runtime Enviroment Bisheng (build 1.8.0_292-b10)
前提:Java代码在windows开发环境能正常稳定运行,并且在压测压力下没有崩溃过。
问题:在信创环境运行java进程,频繁遇到进程崩溃问题,在服务压力小时也偶尔崩溃,服务压力大时频繁崩溃。并且无法稳定复现,有时几分钟就崩溃了,有时好几天才崩溃一次。
崩溃日志:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x0000fffd8c020d28, pid=171524, tid=0x0000fffcf17bf1e0
#
# JRE version: OpenJDK Runtime Environment (8.0_292-b10) (build 1.8.0_292-b10)
# Java VM: OpenJDK 64-Bit Server VM (25.292-b10 mixed mode linux-aarch64 compressed oops)
# Problematic frame:
# j sun.nio.ch.IOUtil.read(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;JLsun/nio/ch/NativeDispatcher;)I+1
#
# Core dump written. Default location: /home/rmms/core or core.171524
#
# If you would like to submit a bug report, please visit:
# https://gitee.com/src-openeuler/openjdk-1.8.0/issues/
#
--------------- T H R E A D ---------------
Current thread (0x0000fffcfc029800): JavaThread "reactor-http-nio-4" daemon [_thread_in_Java, id=171941, stack(0x0000fffcf15c0000,0x0000fffcf17c0000)]
siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x000000077b1784c0
期望解决:能通过什么方式排查进程崩溃的原因?并且由于生产环境原因,如果是兼容问题,需要出示问题分析报告才能升级JDK,所以未尝试使用新版本openjdk进行测试。
PS:目前观察所有的崩溃日志,导致崩溃的原因各种各样,有nio线程导致的,有GC线程导致的,甚至有线程执行CurrentHashMap.get()方法导致的,不过各种原因导致的崩溃,signinfo中的si_signo都是SIGSEGV
你的openjdk是麒麟系统Ky10提供的吗
从你提供的崩溃日志来看,崩溃的原因是发生了
SIGSEGV
(信号11),这通常表示发生了段错误(segmentation fault),即程序试图访问它没有权限访问的内存区域。具体到这个崩溃日志,有几个关键信息点:崩溃位置 :
j sun.nio.ch.IOUtil.read(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;JLsun/nio/ch/NativeDispatcher;)I+1
这表明崩溃发生在
sun.nio.ch.IOUtil.read
方法中,这是Java NIO包中用于底层I/O操作的一个方法。这通常与文件I/O操作有关。崩溃信号 :
siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x000000077b1784c0
si_code: 1 (SEGV_MAPERR)
表示访问了无效的内存地址,si_addr
给出了出错时试图访问的内存地址。线程信息 :
Current thread (0x0000fffcfc029800): JavaThread "reactor-http-nio-4" daemon [_thread_in_Java, id=171941, stack(0x0000fffcf15c0000,0x0000fffcf17c0000)]
这表明崩溃发生在名为
reactor-http-nio-4
的线程中,这是一个与Netty的HTTP NIO事件循环相关的线程。 可能的原因分析:文件I/O操作错误 :可能在进行文件读取操作时,试图访问了未被正确映射或已经关闭的文件描述符。
资源泄露 :长时间运行的程序如果没有正确管理资源(如文件描述符),可能会导致资源泄露,最终导致无法访问某些内存区域。
第三方库问题 :由于崩溃发生在Netty的HTTP NIO事件循环线程中,可能是Netty库的某个版本与当前JDK版本存在兼容性问题。 解决建议:
检查代码 :审查涉及文件I/O操作的代码,确保所有资源(如文件描述符)在使用完毕后都被正确关闭。
资源管理 :确保程序中对资源的管理是正确的,特别是对于长时间运行的程序,要避免资源泄露。
更新和测试 :如果可能,尝试更新Netty库到最新版本,并在开发或测试环境中进行压力测试,以查看问题是否仍然存在。
查看Netty文档和社区 :查看Netty的官方文档和社区,看是否有其他用户报告了类似的问题,并寻找可能的解决方案。
由于崩溃发生在特定的线程和方法中,这可能需要对代码和使用的库进行深入的审查和测试。